Bash Sortを使用してファイルをソートする方法

ファイルを整理し、それらに操作を行う方法を探していますか?プログラミングの中で、ファイルのリストなどのデータを並べ替える必要がある場合があります。Bashのsortコマンドとlsコマンドを使用してファイルを整理することで、物事を整理することができます。

このチュートリアルでは、ファイルとファイルの内容の基本を学びます。

さあ、並べ替えましょう!

前提条件

このチュートリアルではUbuntu 20.04を使用しますが、他のLinuxディストリビューションでも動作します。

Bashを使用してファイルをアルファベット順に並べ替える

Linuxではファイルを並べ替える方法がたくさんありますが、最も一般的な方法であるファイルをアルファベット順に並べ替える方法を説明します。

ターミナルを起動し、以下のls -lコマンドを実行してディレクトリ内のファイルのリストを昇順で取得します。 -lフラグは、lsコマンドに返された出力を長いリスト形式で表示するように指示します。

ls -l
Bash Sort to Sort Files Alphabetically

デフォルトでは、lsコマンドは昇順でファイルをリストします。並べ替えの順序を反転するには、ls -lコマンドに-rフラグを渡します。たとえば、ls -lrとします。 -rフラグをls -lコマンドに渡すことは、このチュートリアルの他の例にも適用されます。

Bash Sortを使用してファイルをサイズ順に並べ替える

ファイルをアルファベット順ではなく、ファイルサイズでソートすることができます。ファイルサイズでソートすることは、リスト内の最小または最大のファイルを優先して表示する際に便利です。

ファイルをサイズでソートするには、-Sフラグを渡してlsコマンドにファイルのリストをサイズでソートするよう指示します。

以下のコマンドを実行して、ファイルをサイズでソートされた長いリスト形式(-lS)で表示します。

ls -lS

下記のように、コマンドはファイルをサイズの降順(最大から最小)でソートしました。

ソート順を逆にするには(最小から最大にするには)、-rフラグを追加します。例:ls -lSr

Sorting Files by Size

Bash Sortを使用してファイルの変更日時でソートする

サイズでソートするだけでなく、ファイルの変更日時でソートする必要がある場合には、次のようなユースケースに遭遇するかもしれません。たとえば、作成したファイルの名前を忘れてしまい、最後に変更した時刻だけ覚えている場合です。

以下のコマンドを実行します。ここで-tパラメータはlsコマンドにファイルを変更日時でソートするよう指示します。

ls -lt
Sorting Files in a Directory by Modification Time

ファイル拡張子でソートする

特定のファイルタイプを持つファイルを探している場合、ファイルを拡張子でソートすることが理想的な解決策です。

以下のコマンドを実行して、作業ディレクトリ内のファイル(ls)を拡張子に基づいてソートします(-lx)。

ls -lX

以下のように、コマンドは同じ拡張子を持つファイルを名前に基づいて昇順でソートしました。

Sorting Files by File Extension

テキストファイル内の内容をソートする

今まで、ディレクトリ内のファイルをソートするさまざまな方法を学びました。今回は、lsコマンドからフォーカスを移して、sortコマンドを実行してみましょう。sortコマンドは、追加するフラグに応じてファイルの内容をソートします。ただし、まずは変更するための内容を持つファイルが必要です。

以下のコマンドを実行して、~/data/fruits.txtという名前のテキストファイルを作成し、フルーツの名前を含めます。バックスラッシュの解釈を有効にするために、-eフラグを使用して各単語を新しい行に書き込みます(\n)。

echo -e "apple \nmango \nwatermelon \ncherry \norange \nbanana" > fruits.txt

次に、以下のコマンドを実行して、fruits.txt内の各単語をsortします。

sort fruits.txt

以下では、ファイルの内容が昇順でソートされていることがわかります。

Sorting File’s Content Alphabetically in Ascending Order

フラグを指定しない場合、sortコマンドはデフォルトで昇順にファイルの内容をソートします。ソート順序を逆にするには、-rフラグをソートコマンドに追加します。例えば、sort -r fruits.txtのようになります。逆順でソートするには、-rフラグを他の例でも使用します。

テキストファイル内の数値リストのソート

数値のソートコマンドは、ファイル内のテキストをソートする方法と似ていますが、-nフラグを追加します。まず、数値をソートするファイルのデモンストレーションを行うために、ファイルを作成しましょう。

以下のコマンドを実行して、各行にランダムな数値が含まれる~/data/scores.txtという名前のファイルを作成します。

echo -e "45 \n69 \n52 \n21 \n3 \n5 \n78" > scores.txt

次に、以下のコマンドを実行して、~/data/scores.txtファイル内の数値(-n)をsortします。

sort -n scores.txt

以下に示すように、最小の数から最大の数までの行にリストされています。

Sorting Numbers in a File

テキストファイルのバージョン番号リストをソートする

もしもテキストファイルにバージョン番号のリストがある場合、--version-sortオプションを追加することで解決できます。

--version-sortオプションの動作を示すために、まずテキストファイルを作成します。

以下のコマンドを実行して、新しい行(\n)ごとにランダムなバージョン番号がリストされた~/data/versions.txtという名前のテキストファイルを作成します。

echo -e "1.0.0.1 \n 6.2.1.0 \n4.0.0.2" > versions.txt

次に、以下のコマンドを実行して、versions.txtファイル内のバージョン番号(--version-sort)をsortします。--field-separatorオプションは、各バージョンの数値がドット(.)で区切られていることをsortコマンドに伝えます。テキストファイルにリストされているバージョンの数値を区切る文字は任意のものに変更できます。

sort --version-sort --field-separator=. versions.txt
Sorting Version Numbers from a Text File

BashのSortを使用して、ファイル拡張子を見つけてソートする

以前の例では、lsまたはsortのいずれかの単一のコマンドを実行していました。しかし、プログラミングでは、よく2つ以上のコマンドを一緒に使用することがあります。どのようにして実現するか?コマンドをパイプラインして、別のコマンドに渡すことで実現します。

以下のコマンドを実行して、作業ディレクトリ(.)内のすべてのマークダウンファイル(-iname "*.md")を検索し、アルファベットの降順でソートします(sort -r)。"*.md"を他のファイル拡張子に変更して、他のファイルを検索してソートしてみてください。

find . -iname "*.md" | sort -r
Finding and Listing Files in Alphabetically Descending Order

標準出力ではなく、ソートされた出力をテキストファイルに保存する場合は、--outputオプションを追加します。以下のように入力します:find . -iname "*.md" | sort -r --output=sorted.txt--outputオプションは、ソートされたファイルリストの出力ファイルを作成するようsortコマンドに指示します。

結論

この記事の目的は、Linuxマシン上でBashコマンドを使用してソートするさまざまな方法を教えることでした。ファイルのリストのソートとファイルの内容のソートを学びました。さらに、より複雑なファイルのソートのために異なるコマンドをパイプライン処理する方法も知ることができるはずです。

この新たな知識を足がかりにして、ファイルリストやファイルの内容のソートを自動化するスクリプトを作成してみてはいかがでしょうか?

Source:
https://adamtheautomator.com/bash-sort/