复制目录但排除具有特定名称的文件

复制目录但排除具有特定名称的文件

我不允许在我正在处理的集群上使用 rsync,所以我需要使用类似cptar等的东西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不会保留文件的稀疏性,并且取决于版本(或操作系统,因为某些操作系统有一些补丁),而不是所有扩展属性。libarchivetar(通常称为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调整文件的选择/包含在其生成或提取的档案中的方式。

相关内容