我正在尝试将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
。
你的问题有三个:
该错误来自于省略
-c
fromsh -c
,这意味着sh
正在尝试执行一个名为cp /Users/perc...
(全部为一个名称)的脚本。它没有找到这个文件。子 shell 还对文件名进行了不正确的引用。由于它包含文件名通配字符,因此需要用引号引起来。
放入
{}
脚本中可能存在潜在危险,或者至少会产生令人困惑的结果。参见示例为什么 Solaris 10 查找 / -exec sh -c "echo {}" \;打印“{}”而不是文件名?
您的第二次尝试将DONE
使用 R 脚本的内容覆盖这些文件。在这里,您也应该引用 R 脚本的文件名(但这并不能解决问题)。