複製目錄但排除具有特定名稱的文件
我不允許在我正在處理的集群上使用 rsync,所以我需要使用
cp
ortar
之類的東西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 -)
請注意,GNU
tar
不會保留文件的稀疏性,並且取決於版本(或作業系統,因為某些作業系統有一些更新檔),而不是所有擴展屬性。libarchive
的tar
(通常稱為bsdtar
)確實保留了擴展屬性,並且-S
提取時的選項可用於創建稀疏文件。這執行了兩個相互連接的子shell。第一個生成一個
tar
流,遞歸地表示.
(目前)目錄及其所有內容,但忽略名稱與test[123]
模式匹配的文件(類似於 shell glob 模式,而不是正則表達式,此處test
後跟 {1,2,3 中的字元} set)c
在d
用cd
. 第二個tar
是在其自己的工作目錄 (dst
) 中動態提取該流。GNU
tar
還可以-C
選擇在chdir()
內部執行此操作,如Gilles 在您連結的問答中所示(其中有一個缺失.
,我現在添加並解釋了您的錯誤),儘管這與使用cd
您的 shell 相比沒有什麼優勢。另請參閱
info -n exclude tar
GNUtar
,了解您可以在那裡排除文件的許多不同方式,以及更一般info -n choosing tar
地調整文件在它生成或提取的檔案中的選擇/包含方式。