序章
すべてのコマンドラインユーティリティで複数のファイルに対してコマンドを実行できるわけではありませんが、シェルスクリプトと for
ループ、選択したコマンドをスーパーチャージできます。
ループは、プログラミングで実行できる最も強力なことの1つです。 これにより、最小限のコードで同じロジックをアイテムのグループに繰り返し適用できます。
このチュートリアルでは、ファイルを反復処理し、Bashシェルまたはzshシェルのいずれかを使用してコマンドを適用します。
ステップ1—ファイルをループする
あなたは使用しようとしています for
このチュートリアルのシェルスクリプトループ。 この特定の制御フローメソッドは、Bashまたはzshコマンドラインシェルに組み込まれています。
次のコマンドは任意のディレクトリに適用できますが、このチュートリアルでは、ディレクトリといくつかのファイルを作成して試してみてください。
まず、ディレクトリを作成します。
- mkdir looping
次に、新しいディレクトリに切り替えます。
- cd looping
今使用します touch
いくつかのテキストファイルを作成するコマンド:
- touch file-1.txt
- touch file-2.txt
- touch file-3.txt
- touch file-4.txt
- touch file-5.txt
ブレース拡張と範囲を使用して、これらのファイルをすばやく作成することもできます。
- touch file-{1..5}.txt
ディレクトリをループしてファイル名を出力するには、次のコマンドを実行します。
- for FILE in *; do echo $FILE; done
次の出力が表示されます。
Outputfile-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!
各ファイルに:
- for FILE in *; do echo -e "$FILE\nLoops Rule\!" > $FILE; done
The -e
フラグを立てる echo
改行が保持されることを保証します。
シェルが文字をシェルコマンドとして解釈しないように、感嘆符は円記号でエスケープする必要があります。
次に、各ファイルを繰り返し処理し、その内容を出力します。
- for FILE in *; do cat $FILE; done
これで、各ファイルの1行目にはファイルの名前が含まれ、2行目にはループに関する普遍的な真実が含まれています。
Outputfile-1.txt
Loops Rule!
file-2.txt
Loops Rule!
file-3.txt
Loops Rule!
file-4.txt
Loops Rule!
file-5.txt
Loops Rule!
さらに一歩進めるために、これらの例を組み合わせて最初にファイルに書き込み、次にその内容を単一のループで表示することができます。
- for FILE in *; do echo -e "$FILE\nLoops Rule\!" > $FILE; cat $FILE; done
次の出力が表示されます。
Outputfile-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
拡大。
各ファイルのバックアップを作成するシェルで次のコマンドを実行します。
- for FILE in *; do cp $FILE "$FILE.bak"; done;
今使用します ls
各ファイルを表示するコマンド:
- ls -l
次の出力が表示されます。
Outputtotal 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
、ディレクトリがすでに存在する場合:
- for FILE in *; do cp $FILE "/tmp/my-backups/$FILE.bak"; done;
バックアップは新しい場所に作成されます。
結論
このチュートリアルでは、 for
シェルでループし、それを使用してファイルを反復処理し、コマンドを適用しました。