私はunix/linuxクラスを取っていますが、まだ変数や関数を学んでいません。フラグやパイプライン、出力、ファイルへの追加などの基本的なユーティリティを学習しました。ラボの割り当てで、彼は最大のファイルを見つけてディレクトリにコピーすることを望んでいます。
5つの最大ファイルを取得できますが、1つのコマンドでそれらをcpに渡す方法がわかりません
ls -SF | grep -v / | head -5 | cp ? Directory
それはそのようになります:
cp `ls -SF | grep -v / | head -5` Directory
パイプラインが正しいと仮定します。バックティックは、行内でその中のコマンドの出力を置き換えます。
テストを行うこともできます:
cp `echo a b c` Directory
すべてのa
、b
、およびc
をDirectory
にコピーします。
私はやります:
cp $(ls -SF | grep -v / | head -5) Directory
ただし、おそらくxargsが最良の答えでしょう。
ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
コマンドの置換を実行するには、「このような」バッククォートまたはドル記号(このような)を使用します。基本的に、これはバックティックコマンドの標準出力の各行を周囲のコマンドに貼り付けて実行します。詳細については、「コマンドの置換」の下のbashのマンページを参照してください。
また、一度に1行ずつ読み取りたい場合は、「while read」構文を使用してパイプストリームから個々の行を読み取ることができます。
ls | while read varname; do echo $varname; done
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