Mac の ls コマンド: 正規表現、オプションなど

UB3/informatics/commands_mac/ls

このページの最終更新日: 2024/09/30

  1. 概要: ls の使い方とオプション
  2. ls でフォルダのみを表示する
  3. ls で特定の拡張子のファイルのみを表示する
  4. ls の結果を拡張子なしで表示・保存する
    • basename を使う方法
    • echo を使う方法
  5. ls の結果を変数に格納する
  6. ls と wc でファイル数を数える

広告

概要: ls の使い方とオプション

ls は、現在のフォルダ (ディレクトリ) にあるファイルやフォルダの一覧を表示する シェルスクリプト のコマンドであり、list segments の略。少なくとも MacLinuxターミナル で同じように使える。Windows の dir に相当する (参考: Win/Mac コマンド比較)。

ターミナルを使って仕事をする場合、このコマンドを何度も使うことになるだろう。以下のオプションを覚えておくと便利。オプションは、以下のようにスペースのあとにタイプする。


$ ls -a


-a

. で始まる隠しファイルを含めた全てのファイルを表示する。

-A

全てのファイルを表示するが、. と .. は表示されない。

-l

アルファベットの「エル」の小文字。ファイルのサイズ、パーミッションなどの詳細まで表示する。表示が長くなるので、long の l らしい (1)。

ls -al で隠しファイルまで表示したり、ls -lt で最終更新日が新しいものから表示したりするなど、他のオプションとの併用も可能。

drwxr-xr-x 2 root wheel 164 Jan 19 2019 Network
drwxr-xr-x 5 root wheel 160 Nov 29 2018 System

  • 行頭に表示される drwxr-xr-x+ のような文字列は、ファイルのパーミッションを示している。詳細は chmod とパーミッション のページを参照のこと。
  • その次に来る root wheel などは、そのファイルまたはフォルダの所有者とグループを意味する。

-1

数字の「いち」。縦に並べる。コピペが便利になる場合があるだろう。

ターミナル上に ls の結果が表示される場合は、複数のファイルまたはフォルダ名が一行に記載される。どういうルールかわからないが、> で結果をファイルに書き出すときは、-1 をつけなくても縦に並ぶような気がする。

しかし、結果を grep に引き渡したりするときは、行ごとに処理をすることになるため、-1 をつけておいた方が安全だろう。

-v

ls では、数字をファイル名に含むファイルが、直感的でない順番で表示されてしまう。たとえば 1.txt、2.txt ... 100.txt という 100 個のファイルがあるフォルダで ls すると、1.txt, 10.txt., 100.txt, 11.txt, 12.txt... という順に並び、1 の次に 2 がこない。

これを順番通りに表示するのが v オプションであるが、どうも MacOS Catalina 以降の zsh には v オプションがない ようである。ls の表示順に関する詳細は、ls で表示される順番 のページにまとめた。

-X

ファイルを拡張子ごとにまとめて表示する。

-R

サブディレクトリの中まで表示する。

-G

ファイルとフォルダを色分けして表示する。

-F

フォルダの最後に / を、実行可能なファイルの最後に * を付加して表示する。


ls でフォルダのみを表示する

フォルダのみを表示する

フォルダ名に / をつける -F オプションを使いつつ、結果を grep に引き渡して表示する。

ls -F -1 | grep /

ファイルのみを表示する

-F オプションを使うのは同じで、grep で調整する。

ls -F -1 | grep -v /

ls で特定の拡張子のファイルのみを表示する

拡張子 .txt のみを表示
(grep 使用)

考え方はフォルダのみの表示と同じ。grep を使う。

ls -1 | grep .txt

拡張子 .txt のみを表示
(* を使用)

ワイルドカードの * を使って、ls *.txt でよい。

.txt.out などが混在しているとき

grep の -v オプションで、必要のないものは取り除く。2 段階のパイプになる。

ls -1 | grep .txt | grep -v .out

ls の結果を拡張子なしで表示・保存する

basename を使う方法

basename は、パス名からファイル名を取得するコマンドである。詳細は このページ など。

basename および while read line と組み合わせて、以下のようにする方法がある。.abc という拡張子を除く方法。あまりスマートとは思えないので、他に良い方法を知っている人がいれば教えてください。

このように、ls > ls.txt のように結果をテキストファイルとして保存し、while read line を使って何らかの処理を実行するのは、フォルダ内の全てのファイルに対して同じ処理をかける場合の有効な手段である。

なお、この場合各行が line という名前の変数に順に入って処理されるが、この変数名は line である必要はない。while read files など、何でもよい。


echo を使う方法

コマンドの結果を変数に格納する shell の基本文法がある。変数=$(コマンド) である。よって

FILENAME=$(ls)

のようにする。さらに、echo で文字を編集することができる。

echo {FILENAME%.*}

% は echo の便利な使い方の一つで、「右端から最短のパターン一致までを除外」する。ファイル名が a.out.txt のようになっている場合、右端から最短の . までが除外されるので、a.out がアウトプットになる。この echo の使用法の詳細は、echo のページ にまとめた。

ls の結果を変数に格納する

テキストファイルに出力して読み込むのではなく、変数に格納して利用したい場合。上の例ですでに出したように、

FILENAME=$(ls)

とする。ls のみでなく、シェルでコマンドの実行結果を変数に入れるときの一般的な書き方である。

ls と wc でファイル数を数える

ls を使う方法もあるようだが、find の方が便利。以下のように行数カウントの wc コマンドに結果を引き渡せば良い。

find 対象ディレクトリ -name "*.html" | wc -l


広告

References

  1. lsコマンドの使い方と覚えたい15のオプション. Link: Last access 2018/03/03.
  2. lsコマンドの全オプション試し! Link: Last access 2019/03/10.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。