![如何使用“-exec”执行“find”命令的输出?](https://linux22.com/image/157022/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E2%80%9C-exec%E2%80%9D%E6%89%A7%E8%A1%8C%E2%80%9Cfind%E2%80%9D%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%EF%BC%9F.png)
这与我的上一个问题有关[如何使用 AWK 始终打印具有一定位数的输出。
所以,现在我有以下命令;目标是根据某些因素将一堆文件复制到不同的目录中:
find . -mtime -5 -type f -name '*data.txt' -printf "cp -p %p "/tmp/HTTPBackup/"%Td"/"\n"
这输出:
cp -p ./32982_96xxdata.txt /tmp/HTTPBackup/09/
cp -p ./32312_96xxdata.txt /tmp/HTTPBackup/11/
cp -p ./32191_96xxdata.txt /tmp/HTTPBackup/07/
现在,我如何执行打印到屏幕上的所有这些行?我要保留-printf
并添加-exec
吗?
前任:
find . -mtime -5 -type f -name '15692_96xxdata.txt' -printf "cp -p %p "/tmp/HTTPBackup/"%Td"/"\n" -exec {} \;
没用;它抱怨权限被拒绝,即使我拥有具有 644 权限的文件 - 一个简单的副本就可以了。
cp -p ./15692_96xxdata.txt /tmp/http_backups/09/
find: ‘./15692_96xxdata.txt’: Permission denied
或-printf
以-exec
某种方式替换?不知道如何尝试这个。
谢谢你!
答案1
您需要在 % 扩展之后将这些-p
, %p
,/tmp/HTTPBackup/%Td
作为单独的参数传递给cp
命令。xargs
如果您打印这些以 NUL 分隔的参数(0 是唯一不能出现在文件路径或执行的命令参数中的字节值),则可以用于安全地进行分割 1:
find . -name '*data.txt' -mtime -5 -type f \
-printf '-p\0%p\0/tmp/HTTPBackup/%Td/\0' |
xargs -r0 -n3 cp
或者:
find . -name '*data.txt' -mtime -5 -type f \
-printf '%p\0/tmp/HTTPBackup/%Td/\0' |
xargs -r0 -n2 cp -p
HTTPBackup
1在全局可写目录中使用具有固定名称 ( ) 的目录(例如)/tmp
可能不安全。
答案2
为了得到常规答案,我引用了对该问题的一些评论。
只需通过附加 .pipe 将其传输到 shell 即可| sh
。只想确认一下:
find . -mtime -5 -type f -name '*data.txt' -printf "cp -p %p "/tmp/HTTPBackup/"%Td"/"\n" | sh
- (1)
-exec {}
表示“将.txt
文件作为脚本运行”。这就是为什么它给你一个权限错误——你没有文件的执行权限.txt
。-exec {}
除非您的文件是脚本,否则不要使用;即便如此,在做之前也要认真考虑一下你在做什么。 find
(2) 如果所有文件名都是“正常”,则通过管道传输into的输出sh
应该可以工作并且安全;即由字母、数字_
和 组成.
。如果文件名可能包含不寻常的字符,它可能会失败,甚至可能是有害的。