我不允许在我正在处理的集群上使用 rsync,所以我需要使用类似cp
或tar
等的东西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 的初学者,所以如果你能解释你的答案以及标志等的作用,那真的会很有帮助,我现在一直在尝试,我认为应该不难做到。
答案1
使用 GNU 或 libarchive 的tar
:
(cd src && tar --exclude='file[123]' -cf - .) |
(cd dst && tar -xpf -)
请注意,GNUtar
不会保留文件的稀疏性,并且取决于版本(或操作系统,因为某些操作系统有一些补丁),而不是所有扩展属性。libarchive
的tar
(通常称为bsdtar
)确实保留扩展属性,并且-S
提取时的选项可用于创建稀疏文件。
它运行两个通过管道相互连接的子 shell。第一个生成一个tar
流,递归地表示.
(当前)目录及其所有内容,但忽略名称与模式匹配的文件test[123]
(类似于 shell glob 模式,而不是正则表达式,这里test
后跟 {1, 2, 3 中的字符) } set)在用.c
挂起子 shell 的当前工作d
目录后cd
第二个tar
在其自己的工作目录 ( ) 中动态提取该流dst
。
GNUtar
也可以-C
选择在内部执行此操作chdir()
,如吉尔斯在您链接的问答中显示(其中缺少一个内容,我现在添加了它并解释了您的错误),尽管这与使用shell.
相比没有什么优势。cd
也可以看看info -n exclude tar
使用 GNUtar
可以通过多种不同的方式排除文件,而且更普遍info -n choosing tar
调整文件的选择/包含在其生成或提取的档案中的方式。