将文件复制到包含具有特定名称的文件的所有子目录中

将文件复制到包含具有特定名称的文件的所有子目录中

我正在尝试将features[30,55].R脚本从桌面复制到包含名称为 的文件的所有子目录中DONE

我尝试了以下命令:

find . -name "DONE"  -exec sh  'cp /Users/percyli/Desktop/features[30,55].R {}' \;

但是,它会给您以下错误:

sh: cp /Users/percyli/Desktop/features[30,55].R ./DONE: No such file or directory
sh: cp /Users/percyli/Desktop/features[30,55].R ./F3/F3-1/DONE: No such file or directory

其中./F3/F3-1是包含“DONE”文件的文件夹之一。

我也尝试过:

find . -name "DONE"  -exec cp /Users/percyli/Desktop/features[30,55].R {} \;

它不会输出错误,但在我运行此命令后实际上什么也没有发生。

这里可能存在什么问题以及如何解决这个问题?

答案1

f='/path/to/features[30,55].R'

find . -type f -name DONE \
    -exec sh -c 'echo cp "$1" "$(dirname "$2")"' sh "$f" {} ';'

这可以正确调用sh将指定文件复制到找到文件的目录的脚本DONE

echo一旦您确定它正在做正确的事情,请将其删除。

或者,

find . -type f -name DONE \
    -execdir cp "$f" . ';'

...如果你find-execdir


你的问题有三个:

  1. 该错误来自于省略-cfrom sh -c,这意味着sh正在尝试执行一个名为cp /Users/perc...(全部为一个名称)的脚本。它没有找到这个文件。

  2. 子 shell 还对文件名进行了不正确的引用。由于它包含文件名通配字符,因此需要用引号引起来。

  3. 放入{}脚本中可能存在潜在危险,或者至少会产生令人困惑的结果。参见示例为什么 Solaris 10 查找 / -exec sh -c "echo {}" \;打印“{}”而不是文件名?

您的第二次尝试将DONE使用 R 脚本的内容覆盖这些文件。在这里,您也应该引用 R 脚本的文件名(但这并不能解决问题)。

相关内容