web-dev-qa-db-ja.com

bashのcpの引数として出力を渡す

私はunix/linuxクラスを取っていますが、まだ変数や関数を学んでいません。フラグやパイプライン、出力、ファイルへの追加などの基本的なユーティリティを学習しました。ラボの割り当てで、彼は最大のファイルを見つけてディレクトリにコピーすることを望んでいます。

5つの最大ファイルを取得できますが、1つのコマンドでそれらをcpに渡す方法がわかりません

ls -SF | grep -v / | head -5 | cp ? Directory
31
Yamiko

それはそのようになります:

cp `ls -SF | grep -v / | head -5` Directory

パイプラインが正しいと仮定します。バックティックは、行内でその中のコマンドの出力を置き換えます。

テストを行うこともできます:

cp `echo a b c` Directory

すべてのab、およびcDirectoryにコピーします。

58
Diego Sevilla

私はやります:

cp $(ls -SF | grep -v / | head -5) Directory

ただし、おそらくxargsが最良の答えでしょう。

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
34
gpojd

コマンドの置換を実行するには、「このような」バッククォートまたはドル記号(このような)を使用します。基本的に、これはバックティックコマンドの標準出力の各行を周囲のコマンドに貼り付けて実行します。詳細については、「コマンドの置換」の下のbashのマンページを参照してください。

また、一度に1行ずつ読み取りたい場合は、「while read」構文を使用してパイプストリームから個々の行を読み取ることができます。

ls | while read varname; do echo $varname; done
6
Brian Gordon

cpに「-t」フラグがある場合(manページを確認してください)、問題を少し単純化します:

ls -SF | grep -v / | head -5 | xargs cp -t DIRECTORY

Findコマンドを使用すると、ls | grepの代わりに、必要なものを取得するためのよりきめ細かい機能が提供されます。私はあなたの質問を次のようにコーディングします:

find . -maxdepth 1 -type f -printf "%p\t%s\n" | 
sort -t $'\t' -k2 -nr | 
head -n 5 | 
cut -f 1 | 
xargs echo cp -t DIRECTORY
0
glenn jackman