web-dev-qa-db-ja.com

アルファベット順で特定の文字で始まるディレクトリから最初のn個のファイルを別のディレクトリに移動します

最初の3つのファイルをアルファベット順でbから始まるディレクトリから別のディレクトリに移動する必要があります。私はこのコマンドを思いつきました:

find /users/students/ejackson/A3-ejackson-55688-114906/CS282in \
  -name "b*" | sort | head -3

そして、それは適切なファイルを生成しますが、私はそれらで何もできません。理想的には、上記のコマンドの出力をmvにパイプするだけですが、それが可能だとは思いません。

(追伸:grepsedまたはawkなしでこれを行う必要があります)

3
Evan

findの出力を解析する(非常に悪い考え)代わりに、forが規則的な方法でファイルをループするという事実を利用できます。

i=0; for b in /path/to/files/b*; do (( ++i < 4 )) && echo mv -v -- "$b" /path/to/destination; done

実際にファイルを移動するには、テスト後にechoを削除します。
ここにいコメントがあります:

# set a variable to 0 so we can increment it
i=0
# glob for the files starting with b
for b in /path/to/files/b*; do 
   # test how many times the loop has been run and if it's less than 4...
   (( ++i < 4 )) && 
     # ... then move the files*  
     echo mv -v -- "$b" /path/to/destination
done

*これは、行の先頭からechoを削除するまで発生しません-代わりに、移動するファイルと移動する場所をエコーし​​ます(各反復の変数を展開します)

これがtcshで機能するかどうかはわかりませんが、bashで機能するため、主にbashを使用する他のUbuntuユーザーに役立つ可能性があります

1
Zanna

ファイルのリストを取得して、シェルスクリプトのforループを介して処理するか、コマンドライン自体で処理することができます(読みにくくなります)

nixCraft でこの記事をチェックしてください。 別のチュートリアル も同様です。

次のようなことができるはずです

for f in `find /users/students/ejackson/A3-ejackson-55688-114906/CS282in -name "b*" | sort | head -3`
do
    cp $f [target]
done
0
Eric G

tcshを使用していると述べました。 Cシェルのファミリーは、Bourneシェルと互換性がありません。このコマンドは機能する可能性があります。

set THREE_FILES=`find …`
cp $THREE_FILES NEW_DIRECTORY

最初のsetコマンドは、THREE_FILESという新しい環境変数を作成し、その変数に出力を保存します。 cpは3つのファイルを取り、NEW_DIRECTORYにコピーします。

0
qbi