私は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
2番目のケースでは、なぜcp
メッセージが表示されないのですか?
答え1
whileループの単純さを考慮すると、xargs
これを操作に使用する方が合理的です。test/
ディレクトリが目立つほど十分に大きいかどうかは疑いがありますが、速度も速くなければなりません。
find test/ -type f -print0 |xargs -o0 cp -ipt app/
-t
これはGNU拡張であることに注意してください。これが問題になる場合は、次のことが必要です(GNUでこれを行うにはaにxargs
変更してください):-J
-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
オプションは、BSDとの互換性を高めるためにPOSIX標準を拡張したものです。