ファイルを整理し、それらに操作を行う方法を探していますか?プログラミングの中で、ファイルのリストなどのデータを並べ替える必要がある場合があります。Bashのsort
コマンドとls
コマンドを使用してファイルを整理することで、物事を整理することができます。
このチュートリアルでは、ファイルとファイルの内容の基本を学びます。
さあ、並べ替えましょう!
前提条件
このチュートリアルではUbuntu 20.04を使用しますが、他のLinuxディストリビューションでも動作します。
Bashを使用してファイルをアルファベット順に並べ替える
Linuxではファイルを並べ替える方法がたくさんありますが、最も一般的な方法であるファイルをアルファベット順に並べ替える方法を説明します。
ターミナルを起動し、以下のls -l
コマンドを実行してディレクトリ内のファイルのリストを昇順で取得します。 -l
フラグは、ls
コマンドに返された出力を長いリスト形式で表示するように指示します。

デフォルトでは、
ls
コマンドは昇順でファイルをリストします。並べ替えの順序を反転するには、ls -l
コマンドに-r
フラグを渡します。たとえば、ls -lr
とします。-r
フラグをls -l
コマンドに渡すことは、このチュートリアルの他の例にも適用されます。
Bash Sortを使用してファイルをサイズ順に並べ替える
ファイルをアルファベット順ではなく、ファイルサイズでソートすることができます。ファイルサイズでソートすることは、リスト内の最小または最大のファイルを優先して表示する際に便利です。
ファイルをサイズでソートするには、-S
フラグを渡してls
コマンドにファイルのリストをサイズでソートするよう指示します。
以下のコマンドを実行して、ファイルをサイズでソートされた長いリスト形式(-lS
)で表示します。
下記のように、コマンドはファイルをサイズの降順(最大から最小)でソートしました。
ソート順を逆にするには(最小から最大にするには)、
-r
フラグを追加します。例:ls -lSr

Bash Sortを使用してファイルの変更日時でソートする
サイズでソートするだけでなく、ファイルの変更日時でソートする必要がある場合には、次のようなユースケースに遭遇するかもしれません。たとえば、作成したファイルの名前を忘れてしまい、最後に変更した時刻だけ覚えている場合です。
以下のコマンドを実行します。ここで-t
パラメータはls
コマンドにファイルを変更日時でソートするよう指示します。

ファイル拡張子でソートする
特定のファイルタイプを持つファイルを探している場合、ファイルを拡張子でソートすることが理想的な解決策です。
以下のコマンドを実行して、作業ディレクトリ内のファイル(ls
)を拡張子に基づいてソートします(-lx
)。
以下のように、コマンドは同じ拡張子を持つファイルを名前に基づいて昇順でソートしました。

テキストファイル内の内容をソートする
今まで、ディレクトリ内のファイルをソートするさまざまな方法を学びました。今回は、ls
コマンドからフォーカスを移して、sort
コマンドを実行してみましょう。sort
コマンドは、追加するフラグに応じてファイルの内容をソートします。ただし、まずは変更するための内容を持つファイルが必要です。
以下のコマンドを実行して、~/data/fruits.txtという名前のテキストファイルを作成し、フルーツの名前を含めます。バックスラッシュの解釈を有効にするために、-e
フラグを使用して各単語を新しい行に書き込みます(\n
)。
次に、以下のコマンドを実行して、fruits.txt
内の各単語をsort
します。
以下では、ファイルの内容が昇順でソートされていることがわかります。

フラグを指定しない場合、
sort
コマンドはデフォルトで昇順にファイルの内容をソートします。ソート順序を逆にするには、-r
フラグをソートコマンドに追加します。例えば、sort -r fruits.txt
のようになります。逆順でソートするには、-r
フラグを他の例でも使用します。
テキストファイル内の数値リストのソート
数値のソートコマンドは、ファイル内のテキストをソートする方法と似ていますが、-n
フラグを追加します。まず、数値をソートするファイルのデモンストレーションを行うために、ファイルを作成しましょう。
以下のコマンドを実行して、各行にランダムな数値が含まれる~/data/scores.txtという名前のファイルを作成します。
次に、以下のコマンドを実行して、~/data/scores.txtファイル内の数値(-n
)をsort
します。
以下に示すように、最小の数から最大の数までの行にリストされています。

テキストファイルのバージョン番号リストをソートする
もしもテキストファイルにバージョン番号のリストがある場合、--version-sort
オプションを追加することで解決できます。
--version-sort
オプションの動作を示すために、まずテキストファイルを作成します。
以下のコマンドを実行して、新しい行(\n
)ごとにランダムなバージョン番号がリストされた~/data/versions.txtという名前のテキストファイルを作成します。
次に、以下のコマンドを実行して、versions.txtファイル内のバージョン番号(--version-sort
)をsort
します。--field-separator
オプションは、各バージョンの数値がドット(.
)で区切られていることをsort
コマンドに伝えます。テキストファイルにリストされているバージョンの数値を区切る文字は任意のものに変更できます。

BashのSortを使用して、ファイル拡張子を見つけてソートする
以前の例では、ls
またはsort
のいずれかの単一のコマンドを実行していました。しかし、プログラミングでは、よく2つ以上のコマンドを一緒に使用することがあります。どのようにして実現するか?コマンドをパイプラインして、別のコマンドに渡すことで実現します。
以下のコマンドを実行して、作業ディレクトリ(.
)内のすべてのマークダウンファイル(-iname "*.md"
)を検索し、アルファベットの降順でソートします(sort -r
)。"*.md"
を他のファイル拡張子に変更して、他のファイルを検索してソートしてみてください。

標準出力ではなく、ソートされた出力をテキストファイルに保存する場合は、
--output
オプションを追加します。以下のように入力します:find . -iname "*.md" | sort -r --output=sorted.txt
。--output
オプションは、ソートされたファイルリストの出力ファイルを作成するようsort
コマンドに指示します。
結論
この記事の目的は、Linuxマシン上でBashコマンドを使用してソートするさまざまな方法を教えることでした。ファイルのリストのソートとファイルの内容のソートを学びました。さらに、より複雑なファイルのソートのために異なるコマンドをパイプライン処理する方法も知ることができるはずです。
この新たな知識を足がかりにして、ファイルリストやファイルの内容のソートを自動化するスクリプトを作成してみてはいかがでしょうか?