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

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標準を拡張したものです。

おすすめ記事