cp 与交互式在覆盖之前不提示

cp 与交互式在覆盖之前不提示

我观察到了一个奇怪的行为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 -print0xargs -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。

相关内容