Rsync

rsync 包括排除

  • March 2, 2021

我知道有十億個這樣的問題。但我很肯定我已經嘗試了很多,但我無法完成這項工作,所以請不要只將其標記為重複

我的文件系統看起來像

1_counts/
|_________sample1/
         |__________boring_file1
         |__________boring_file2
         |__________boring_dir1/
                    |__________boring_file1
                    |__________boring_file2
         |__________dir/
                    |__________boring_file1
                    |__________boring_file2
                    |__________another_dir/
                               |__________file1
                               |__________file2
                               |__________file3
                               |__________boring_dir/
                                          |__________boring_file
                               |__________boring_file.RData

我有幾個“樣本”目錄。

我需要將文件 1、2 和 3 同步到another_dir/. 我想保留文件結構(我沒有目標中的子/目錄),我只是不想複製所有內容。

我首先嘗試將所有內容都放在以下位置dir/another_dir

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/" \
--exclude="*" 1_counts/* .

這不會返回任何帶有消息的文件[sender] hiding directory sample_1 because of pattern *。與

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*" 1_counts/* .

此選項(此處稱為解決方案 1)檢索了以下所有內容dir/another_dir/

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*/*" 1_counts/* .

Tbh,我猜到了。我不知道為什麼我需要*/*排除。

如果我嘗試

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/" \
--exclude="*/*" 1_counts/* .

我只得到dir/another_dir目錄,而不是內容。正如預期的那樣。

如果我這樣做

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/*" \
--exclude="*/*" 1_counts/* .

我只得到dir/目錄,沒有內容。我想這也是意料之中的(第二個答案在這裡)但我很困惑為什麼我another_dir也沒有得到…一個謎。

無論如何,現在我可以使用解決方案 1 從1_counts/sample1/dir/another_dir. 現在我試圖排除boring_file.RData 和dir/another_dir/boring_dir.

我試過了

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*.RData" \
--exclude="boring_dir/" \
--exclude="*/*" 1_counts/* .

這行不通。一切仍然包括在內。我認為這與路徑有關,所以我也嘗試了

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="dir/another_dir/*.RData" \
--exclude="dir/another_dir/boring_dir/" \
--exclude="*/*" 1_counts/* .

也不行。我的選擇已經不多了,我對為什麼其中的某些部分有效……

我非常感謝您對此的任何意見。

在這一點上,您非常接近解決方案:

rsync -r -v --dry-run --include="dir/" \
--include="dir/another_dir/***" \
--exclude="*.RData" \
--exclude="boring_dir/" \
--exclude="*/*" 1_counts/* .

問題是它rsync 使用了第一個匹配模式,因此通過將所有內容another_dir包含在 .RData 文件中,您可以有效地包含無聊的東西和 .RData 文件。您只需更改過濾規則的順序:

rsync -r -v --dry-run --include="dir/" \
--exclude="*.RData" \
--exclude="boring_dir/" \
--include="dir/another_dir/***" \
--exclude="*/*" 1_counts/* .

因為順序很重要,所以人們在開頭放置了通過副檔名排除文件的規則,並在末尾放置了排除所有文件的規則。

引用自:https://unix.stackexchange.com/questions/637165