【发布时间】:2017-08-04 13:31:25
【问题描述】:
我有一个包含子目录和文件的目录(称为“源”)。使用 bash 我需要将在该目录及其每个子目录中找到的所有文件(并且只有文件,而不是目录)复制到不同的目录(称为“目标”)。目录树不得维护/必须展平。只有不包含在文本文件中的文件(称为“excluded.txt”)必须被复制。
源输入示例:
/home/source/AAA/file1.xyz
/home/source/AAA/GGG/file2.xyz
/home/source/BBB/file3.tuv
/home/source/BBB/HHH/file4.tuv
目标输出示例:
/home/destination/file1.xyz
/home/destination/file2.xyz
/home/destination/file3.tuv
/home/destination/file4.tuv
一旦文件被复制,四个以上的文件名(file1.xyz 等)被添加到excluded.txt 中(每个文件名都在一个新行上)。然后将定期从目标目录中删除文件。
如果再次执行 bash 脚本,并且存在源文件,并且它们的文件名出现在 exclude.txt 文件中,则不应将它们复制到目标位置。
由于目录树结构得到维护,我尝试使用“cp”和“rsync”失败了。我也未能使用“查找”,因为在执行复制操作之前,我无法对照“excluded.txt”列表检查结果。
【问题讨论】:
-
找到 /home/source/ -type f -exec cp -n {} /home/destination/ \;如果要避免覆盖目标文件夹中的现有文件,请使用 'cp -n'
-
@KuldeepSingh 我最初编写此代码 sn-p 作为答案,但我忘了考虑到 OP 有一个包含排除文件的文件
-
使用 cp 命令的 -n 选项可以避免重写文件。除非在其他地方需要 exclude.txt
-
@KuldeepSingh 感谢您提出的解决方案!如果文件保留在目标目录中,它将起作用。但是,由于文件会定期删除,excluded.txt 列表会跟踪所有移动/复制的文件。