如何使用“-exec”执行“find”命令的输出?

如何使用“-exec”执行“find”命令的输出?

这与我的上一个问题有关[如何使用 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

HTTPBackup1在全局可写目录中使用具有固定名称 ( ) 的目录(例如)/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应该可以工作并且安全;即由字母、数字_和 组成.。如果文件名可能包含不寻常的字符,它可能会失败,甚至可能是有害的。

相关内容