【问题标题】:Avoid copying subdirectory contents multiple times when recursively copying files递归复制文件时避免多次复制子目录内容
【发布时间】:2019-11-23 03:41:57
【问题描述】:

脚本执行一个简单的操作,将所有文件(不包括“.log”文件)和所有子目录复制到目标文件夹中。我遇到的问题是驻留在子目录中的文件也被复制到目标文件夹中,因此最终结果是这些文件显示了两次;在目标文件夹以及该文件夹的子文件夹中。如何避免这种情况?谢谢

source_dir="path/to/source"
dest_dir="path/to/destination"

arg=${1}
echo $arg

if [[ ! -d $dest_dir ]]; then
    echo "creating destination directory $dest_dir"
    mkdir $dest_dir
fi  

#copy all files that don't end with .log
for resource in `find $source_dir ! -name '*.log'`; do
        echo "copying resource $resource..."
        cp -r $resource $dest_dir
done

【问题讨论】:

  • 不是您的直接问题,但请阅读BashPitfalls #1 以了解为什么此代码不适用于带有空格的文件名,并阅读UsingFind 以了解该怎么做。此外,通过shellcheck.net 运行它并修复识别的引用错误。
  • ...也就是说,您真正的问题是如何排除路径?如果是这样,请参阅find 中描述使用-prune 操作的任何现有问答条目。但是,这里的示例路径不会发生这种情况,因为在问题的代码中,目标不在源代码之下。
  • 或者你在问如何告诉find不要递归?我们也已经有相关条目。

标签: linux bash


【解决方案1】:

考虑用单个命令替换 for 大小写:

rsync -avz --exclude '*.log' path/to/source/ path/to/destination/

rsync 不需要运行rtools。并且它在本地运行得很好,就像这样的目的。

【讨论】:

    【解决方案2】:

    我不认为 rsync 有递归限制器,而且对于这样的事情,无论如何它可能有点矫枉过正。

    (cd /path/to/source; find -maxdepth 1 ! -name \*.log | cpio -pdv /path/to/destination)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2013-11-06
      相关资源
      最近更新 更多