rsync 包括排除
我知道有十億個這樣的問題。但我很肯定我已經嘗試了很多,但我無法完成這項工作,所以請不要只將其標記為重複
我的文件系統看起來像
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/* .
因為順序很重要,所以人們在開頭放置了通過副檔名排除文件的規則,並在末尾放置了排除所有文件的規則。