Bash

複製目錄但排除具有特定名稱的文件

  • November 12, 2021

我不允許在我正在處理的集群上使用 rsync,所以我需要使用cportar之類的東西find。我想複製一個大目錄,包括所有文件和子文件夾等,同時忽略,即不複製任何文件例如具有名稱“file1”、“file2”或“file3”。

我在 SO 上看到了這篇文章, 它允許我只包含某些文件。我基本上想要那個,但我想排除某些文件。

我也嘗試了這個解決方案 ,但是當我嘗試使用tar那裡建議的命令時,我得到了錯誤tar: This does not look like a tar archive並且tar: Cowardly refusing to create an empty archive

cp !(filename-to-ignore) new_dir/我也從這篇文章中嘗試過,但這不會複製子文件夾。

我是 bash 的初學者,所以如果你能解釋你的答案以及標誌等的作用,那真的很有幫助,我現在一直在嘗試,我認為不應該那麼難做。

使用 GNU 或 libarchive 的tar

(cd src && tar --exclude='file[123]' -cf - .) |
 (cd dst && tar -xpf -)

請注意,GNUtar不會保留文件的稀疏性,並且取決於版本(或作業系統,因為某些作業系統有一些更新檔),而不是所有擴展屬性。libarchivetar(通常稱為bsdtar)確實保留了擴展屬性,並且-S提取時的選項可用於創建稀疏文件。

這執行了兩個相互連接的子shell。第一個生成一個tar流,遞歸地表示.(目前)目錄及其所有內容,但忽略名稱與test[123]模式匹配的文件(類似於 shell glob 模式,而不是正則表達式,此處test後跟 {1,2,3 中的字元} set)cdcd. 第二個tar是在其自己的工作目錄 ( dst) 中動態提取該流。

GNUtar還可以-C選擇在chdir()內部執行此操作,如Gilles 在您連結的問答中所示(其中有一個缺失.,我現在添加並解釋了您的錯誤),儘管這與使用cd您的 shell 相比沒有什麼優勢。

另請參閱info -n exclude tarGNU tar,了解您可以在那裡排除文件的許多不同方式,以及更一般info -n choosing tar地調整文件在它生成或提取的檔案中的選擇/包含方式。

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