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 не запрашивал.

Учитывая простоту цикла while, имеет смысл использовать xargs для вашей задачи. Это также должно быть быстрее, хотя я сомневаюсь, что ваш каталог test/ будет достаточно большим, чтобы заметить.

 find test/ -type f -print0 |xargs -0 cp -ipt app/ 

Заметим, что -t является расширением GNU. Если это проблематично, вам понадобится что-то вроде этого (чтобы сделать это с помощью GNU xargs , измените -J на -I ):

 find test/ -type f -print0 |xargs -0 -J % cp -ip % app/ 

Я использовал find -print0 и xargs -0 поэтому это будет работать, даже если ваши файлы имеют пробелы в своих именах.