我观察到了一个奇怪的行为cp。确切地说,即使有交互选项,cp 也没有要求我确认。
测试用例如下所示
现有文件
find * -type f
app/file.txt
test/file.txt
正确的行为
/usr/bin/cp -ip test/file.txt app/
cp: overwrite app//file.txt (yes/no)? yes
不正确的行为
find test/ -type f | while read line; do /usr/bin/cp -ip $line app/; done
为什么第二种情况cp
没有提示。
答案1
鉴于 while 循环的简单性,将其用于xargs
您的任务更有意义。它也应该更快,尽管我怀疑您的test/
目录是否足够大以引起注意。
find test/ -type f -print0 |xargs -o0 cp -ipt app/
请注意,这-t
是一个 GNU 扩展。如果这是有问题的,你需要这样的东西(要使用 GNU 执行此操作xargs
,请将 更改-J
为 a -I
):
find test/ -type f -print0 |xargs -o0 -J % cp -ip % app/
我使用过find -print0
,xargs -0
所以即使你的文件名称中有空格,这也能工作。
当xargs
问题的while
循环以这种方式运行时,标准输入被消耗,因此与终端(终端, /dev/tty
) 无法保证。
在每个子进程中使用xargs -o
重新打开标准输入/dev/tty
以允许交互。请注意,这在 GNU xargs 和 BSD xargs 中都可用,但是不是Busybox xargs 或其他基本框架POSIX xargs。
来自 xargs(1) 的 GNU findutils 手册页:
-o
,--open-tty
/dev/tty
在执行命令之前,像在子进程中一样重新打开 stdin 。如果您想xargs
运行交互式应用程序,这非常有用。……
该
-o
选项是 POSIX 标准的扩展,以更好地兼容 BSD。