序章

すべてのコマンドラインユーティリティで複数のファイルに対してコマンドを実行できるわけではありませんが、シェルスクリプトと for ループ、選択したコマンドをスーパーチャージできます。

ループは、プログラミングで実行できる最も強力なことの1つです。 これにより、最小限のコードで同じロジックをアイテムのグループに繰り返し適用できます。

このチュートリアルでは、ファイルを反復処理し、Bashシェルまたはzshシェルのいずれかを使用してコマンドを適用します。

ステップ1—ファイルをループする

あなたは使用しようとしています for このチュートリアルのシェルスクリプトループ。 この特定の制御フローメソッドは、Bashまたはzshコマンドラインシェルに組み込まれています。

次のコマンドは任意のディレクトリに適用できますが、このチュートリアルでは、ディレクトリといくつかのファイルを作成して試してみてください。

まず、ディレクトリを作成します。

  1. mkdir looping

次に、新しいディレクトリに切り替えます。

  1. cd looping

今使用します touch いくつかのテキストファイルを作成するコマンド:

  1. touch file-1.txt
  2. touch file-2.txt
  3. touch file-3.txt
  4. touch file-4.txt
  5. touch file-5.txt

ブレース拡張と範囲を使用して、これらのファイルをすばやく作成することもできます。

  1. touch file-{1..5}.txt

ディレクトリをループしてファイル名を出力するには、次のコマンドを実行します。

  1. for FILE in *; do echo $FILE; done

次の出力が表示されます。

Output
file-1.txt file-2.txt file-3.txt file-4.txt file-5.txt

ワイルドカード文字を使用していることに気付いたと思いますが、 *、 そこで。 それは for ディレクトリ内のすべてのファイルを取得するためにループします。 ワイルドカードを次のように変更できます file-* で始まるすべてのファイルをターゲットにする file-、または *.txt テキストファイルだけを取得します。

ディレクトリ内のファイルをループして名前を吐き出す方法がわかったので、コマンドでそれらのファイルを使用してみましょう。

ステップ2—コマンドを適用する

前のセクションで作成したファイルはすべて、 touch コマンドとは空なので、 cat 各ファイルはあまり役に立ちません。

幸いなことに、同様のものを使用して for ループでは、1つのコマンドで各ファイルにテキストを挿入できます。

次のコマンドを実行して、ファイルの名前、改行、テキストを挿入します Loops Rule! 各ファイルに:

  1. for FILE in *; do echo -e "$FILE\nLoops Rule\!" > $FILE; done

The -e フラグを立てる echo 改行が保持されることを保証します。

シェルが文字をシェルコマンドとして解釈しないように、感嘆符は円記号でエスケープする必要があります。

次に、各ファイルを繰り返し処理し、その内容を出力します。

  1. for FILE in *; do cat $FILE; done

これで、各ファイルの1行目にはファイルの名前が含まれ、2行目にはループに関する普遍的な真実が含まれています。

Output
file-1.txt Loops Rule! file-2.txt Loops Rule! file-3.txt Loops Rule! file-4.txt Loops Rule! file-5.txt Loops Rule!

さらに一歩進めるために、これらの例を組み合わせて最初にファイルに書き込み、次にその内容を単一のループで表示することができます。

  1. for FILE in *; do echo -e "$FILE\nLoops Rule\!" > $FILE; cat $FILE; done

次の出力が表示されます。

Output
file-1.txt Loops Rule! file-2.txt Loops Rule! file-3.txt Loops Rule! file-4.txt Loops Rule! file-5.txt Loops Rule!

コマンドをセミコロンで区切ることにより、 ;、必要なコマンドをつなぎ合わせることができます。

次に、実際の例を見てみましょう。ファイルのバックアップコピーを作成します。

ステップ3—ファイルのバックアップを作成する

今、あなたはどのように for ループは機能します。ファイルのディレクトリを取得し、接尾辞が付いたバックアップを作成して、もう少し現実的な世界を試してみましょう。 .bak 拡大。

各ファイルのバックアップを作成するシェルで次のコマンドを実行します。

  1. for FILE in *; do cp $FILE "$FILE.bak"; done;

今使用します ls 各ファイルを表示するコマンド:

  1. ls -l

次の出力が表示されます。

Output
total 40K -rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-1.txt -rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-1.txt.bak -rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-2.txt -rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-2.txt.bak -rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-3.txt -rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-3.txt.bak -rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-4.txt -rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-4.txt.bak -rw-r--r-- 1 sammy sammy 29 Nov 7 18:34 file-5.txt -rw-r--r-- 1 sammy sammy 29 Nov 7 18:41 file-5.txt.bak

これで、各ファイルの正確なコピーが作成され、拡張子がバックアップファイルであることを示します。

同じディレクトリにコピーを作成することに限定されません。 バックアップファイルの新しいパスを指定できます。 次のコマンドは、バックアップをフォルダに保存します /tmp/my-backups、ディレクトリがすでに存在する場合:

  1. for FILE in *; do cp $FILE "/tmp/my-backups/$FILE.bak"; done;

バックアップは新しい場所に作成されます。

結論

このチュートリアルでは、 for シェルでループし、それを使用してファイルを反復処理し、コマンドを適用しました。