0

そのインタビューの質問. インタビュアーは、私がシェル スクリプトの経験がないことを理解しているときに、この「基本的な」シェル スクリプトの質問をしました。ここで質問です。

サイズが 500 K を超えるディレクトリから別のディレクトリにファイルをコピーします。

C lang ならすぐにできますが、シェル スクリプトでは難しいようで、試したことがありません。unix の基本的なコマンドに精通しているので、試してみましたが、以下のコマンドを使用してそれらのファイル名を抽出することはできます。

du -sk * | awk  '{ if ($1>500) print $2 }'

また、良いシェルスクリプトのサンプル本を教えてください。

4

3 に答える 3

4

それはいくつかの方法で行うことができます。私は試してみて、findを使用します:

find $FIRSTDIRECTORY -size +500k -exec cp "{\} $SECONDDIRECTORY \;

現在のディレクトリに制限するには、-maxdepth オプションを使用します。

于 2012-07-03T11:45:55.757 に答える
3

duサブディレクトリに再帰しますが、これはおそらく望ましくありません (その点があいまいである場合は、明確化を求めることができます)。サイズを使用ls -lまたは取得することが期待されていた可能性が高くなります。ls -s

しかし、あなたが行ったことはいくつかのファイルを選択してそれらの名前を出力するために機能するので、それに基づいて構築しましょう. 名前のリストを出力するコマンドがあります。そのコマンドの出力を のコマンド ラインに入力する必要がありますcp。du|awk がこれを出力する場合:

Makefile
foo.c
bar.h

これを実行したい:

cp Makefile foo.c bar.h otherdirectory

したがって、それを行う方法は、次のように記述されたCOMMAND SUBSTITUTIONを使用することです。$(...)

cd firstdirectory
cp $(du -sk * | awk '{ if ($1>500) print $2 }') otherdirectory

そして、それは機能するスクリプトです。du|awk コマンドが最初に実行され、その出力が cp コマンドの構築に使用されます。一般的な使用には適さない微妙な欠点がたくさんありますが、それが初心者レベルのシェル スクリプトの通常のやり方です。

于 2012-07-03T11:46:02.267 に答える
0
find . -mindepth 1 -maxdepth 1 -type f -size +BYTESc -exec cp -t DESTDIR {}\+

サイズのc接尾辞は必須です。サイズはバイト単位です。そうしないと、-sizeチェックの結果を決定する際に、おそらく予期しない丸め動作が発生します。コピーが再帰的であることを意図している場合は、宛先ディレクトリも作成する必要があります。

于 2012-07-03T11:48:33.797 に答える