ディレクトリ内のファイルをループする方法
序章
すべてのコマンドラインユーティリティで複数のファイルに対してコマンドを実行できるわけではありませんが、シェルスクリプトと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
echo
の-e
フラグは、改行が保持されることを保証します。
シェルが文字をシェルコマンドとして解釈しないように、感嘆符は円記号でエスケープする必要があります。
次に、各ファイルを繰り返し処理し、その内容を出力します。
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
ループを試し、それを使用してファイルを反復処理し、コマンドを適用しました。