我使用以下命令查找文件并将其复制到其他地方,
find /search/ -name file.txt -exec cp -Rp {} /destination \;
如何复制父目录中的所有文件和子目录file.txt
?
例子,
/search/test/sub
/search/test/sub2
/search/test/file.txt
/search/test/file.doc
它们应该被复制为
/destination/sub
/destination/sub2
/destination/file.txt
/destination/file.doc
答案1
使用-execdir
(不是标准谓词,但经常实现),给定的实用程序将在找到文件的目录中执行。
这意味着你可以做
find /search -name file.txt -execdir cp -Rp . /destination \;
没有-execdir
:
find /search -name file.txt -exec sh -c 'cp -Rp "${1%/*}/." /destination' sh {} \;
或者,
find /search -name file.txt -exec sh -c 'cd "${1%/*}" && cp -Rp . /destination' sh {} \;
最后两个变体为每个找到的文件执行一个简短的内联脚本。该脚本将文件的路径名作为其第一个参数(在 中),并使用(标准参数替换)$1
从路径名中删除文件名。${1%/*}
然后它应用cp
与第一个变体中相同的命令-execdir
。
执行此操作的代码cd
更忠实地模拟-execdir
顶部变体实际执行的操作,而中间变体通过引用.
路径末尾的源目录来绕过目录更改。