47

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

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

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

4 に答える 4

79

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

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

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

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

cp `echo a b c` Directory

aすべてのb、、をにコピーcDirectoryます。

于 2011-07-26T16:49:27.023 に答える
51

私はします:

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

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

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
于 2011-07-26T16:54:16.083 に答える
7

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

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

ls | while read varname; do echo $varname; done
于 2011-07-26T16:57:10.153 に答える
0

cp「-t」フラグがある場合(マニュアルページを確認してください)、問題が少し単純化されます。

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
于 2011-07-26T17:15:19.980 に答える