ファイルリスト
管理者は、 lsコマンドを使用して、ディレクトリの内容の簡単なリストを表示する最初のコマンドの 1つに精通しています。 多くの管理者は、 -aおよび-lスイッチを使用して、
'.'
を含むすべてのファイルをリストする方法も知っています
'.'
および
'..'
、および列ごとに詳細なファイル情報をそれぞれ表示します。
lsにはさらにいくつかのキーがありますが、これらはやや一般的ではありませんが、プログラミングの目的には非常に便利です。
- -t-最終変更日で降順に並べられたファイルを一覧表示します。 このキーは、おそらくheadまたはsed 10qを介して渡された最新の編集済みファイルのリストをすばやく取得する必要がある場合に、非常に大きなディレクトリに役立ちます。 おそらく-lと組み合わせて最も便利です。 最も古いファイルが必要な場合は、-rを追加して、リストを逆順に並べ替えることができます。
- -X-ファイルを拡張子別にグループ化します。 多言語開発、ヘッダーファイルとメインコードの分離、コードファイルとディレクトリまたはアセンブリファイルの分離に役立ちます。
- -v-ファイル名のバージョン番号を簡単にソートできます。
- -S-ファイルサイズで並べ替えます。
- -R-サブディレクトリを含むファイルを再帰的に一覧表示します。 このスイッチは、 -lと組み合わせて、 lessのようなページリーフレットに出力をリダイレクトするのに適しています。
ファイルのリストはプレーンテキストなので、ストリームをvimに送信し 、各ファイルに説明を追加してから、テキストをインベントリとして保存するか、READMEに追加できます。
$ ls -XR | vim -
このようなことは、多くの労力をかけずにmakeで自動化することもできます。これについては、このシリーズの別の記事で説明します。
ファイル検索
奇妙なことに、引数なしで「 find 」と入力するだけで、相対パスを含むファイルの完全なリストを取得できますが、通常はsortで順番に並べるのが最善です:
$ find | sort . ./Makefile ./README ./build ./client.c ./client.h ./common.h ./project.c ./server.c ./server.h ./tests ./tests/suite1.pl ./tests/suite2.pl ./tests/suite3.pl ./tests/suite4.pl
lsなどのファイルを一覧表示する場合は、 -lsを追加できます。
$ find -ls | sort -k 11 1155096 4 drwxr-xr-x 4 tom tom 4096 Feb 10 09:37 . 1155152 4 drwxr-xr-x 2 tom tom 4096 Feb 10 09:17 ./build 1155155 4 -rw-r--r-- 1 tom tom 2290 Jan 11 07:21 ./client.c 1155157 4 -rw-r--r-- 1 tom tom 1871 Jan 11 16:41 ./client.h 1155159 32 -rw-r--r-- 1 tom tom 30390 Jan 10 15:29 ./common.h 1155153 24 -rw-r--r-- 1 tom tom 21170 Jan 11 05:43 ./Makefile 1155154 16 -rw-r--r-- 1 tom tom 13966 Jan 14 07:39 ./project.c 1155080 28 -rw-r--r-- 1 tom tom 25840 Jan 15 22:28 ./README 1155156 32 -rw-r--r-- 1 tom tom 31124 Jan 11 02:34 ./server.c 1155158 4 -rw-r--r-- 1 tom tom 3599 Jan 16 05:27 ./server.h 1155160 4 drwxr-xr-x 2 tom tom 4096 Feb 10 09:29 ./tests 1155161 4 -rw-r--r-- 1 tom tom 288 Jan 13 03:04 ./tests/suite1.pl 1155162 4 -rw-r--r-- 1 tom tom 1792 Jan 13 10:06 ./tests/suite2.pl 1155163 4 -rw-r--r-- 1 tom tom 112 Jan 9 23:42 ./tests/suite3.pl 1155164 4 -rw-r--r-- 1 tom tom 144 Jan 15 02:10 ./tests/suite4.pl
この場合、11番目の出力列、つまりファイル名でソートする順序を指定する必要がありました。 これには-kスイッチが使用されます。
Findには 、インラインフィルター用のかなり複雑な構文があります。 次の例は、必要なファイルのリストを取得するために使用できる最も便利なものの一部を示しています。
-
find -name '*.c'
シェル形式のマスクに従って名前を持つファイルを検索します。 大文字と小文字を区別しない検索には-inameを使用できます。 -
find -path '*test*'
-パスがマスクに一致するファイルを検索します。 大文字と小文字を区別しない検索には-ipathを使用できます。 -
find -mtime -5
過去5日間に編集されたファイルを検索します。 +5を使用すると、5日前より前に変更されたファイルを見つけることができます。 -
find -newer server.c
-server.c
より前に変更されたファイルを検索します。 -
find -type d
ディレクトリを検索します。 ファイルを検索するには、 -type fを使用します。 シンボリックリンクの場合-type l
上記のすべてを組み合わせることができます。 たとえば、過去2日間に編集されたCソースコードを見つけるには、次のように記述します。
$ find -name '*.c' -mtime -2
Findは、見つかったファイルに対してさまざまなアクションを実行できます。 デフォルトでは、これによりリストは標準出力に送られますが、他にもいくつかのオプションがあります。
- -ls - ls -lスタイルでリストします。
- -delete-見つかったファイルを削除します。
- -exec-各ファイルで任意のコマンドラインを実行します。{}は対応するファイル名に置き換えられ、 \; 例えば:
$ find -name '*.pl' -exec perl -c {} \;
ほとんどの場合、結果がコマンドの引数に変わるようにxargsを使用する方が簡単です:
$ find -name '*.pl' | xargs perl -c
- -print0-名前にスペースを含むファイルがあり、前の例のようにxargsに転送する場合、このキーを使用します。スペースの代わりに0文字がレコード区切り文字に割り当てられます。 同時に、xargsは-0スイッチで開始する必要があります。
$ find -name '*.jpg' -print0 | xargs -0 jpegoptim
私はよく次のトリックを使ってリストを生成し、それを画面を垂直に分割するVimウィンドウで編集できます。
$ vim -O $(find . -name '*.c')
その他のファイル検索
それでも、多くの場合、外部属性よりも、その内容に基づいてファイルを検索する必要があります。ここでは、 grep 、特にgrep -Rが急いで駆けつけます。 このコマンドは、指定されたテキストに一致するものを現在のディレクトリで再帰的に検索します。
$ grep -FR 'someVar' .
grepはデフォルトで大文字と小文字を区別するため、大文字と小文字を区別しないフラグを忘れないでください。
$ grep -iR 'somevar' .
grep -l
を使用して、行自体が一致しない一致を含むファイルをリストすることもできます。 これも、テキストエディターでさらに編集するためにファイルのリストを作成するときに便利です。
$ vim -O $(grep -lR 'somevar' .)
プロジェクトがバージョン管理を使用している場合、すべてのメタデータは通常
.svn
、
.git
または
.hg
含まれてい
.hg
。 固定文字列(
grep -F
)と比較することで、不要な要素を簡単に削除(
grep -v
)できます。
$ grep -R 'someVar' . | grep -vF '.svn'
ackと呼ばれる非常に人気のあるgrepの代替手段があります。これはデフォルトで、すべての類似した殻を除去します。 Ackでは、Perl互換の正規表現(PCRE)を使用することもできるため、多くのハッカーに愛されています。 彼女には、ソースコードを操作する非常に便利な手段があります。 古き良きgrepには問題がないという事実にもかかわらず、それは常に手元にあるので、可能であればAckをインストールすることを強くお勧めします。 すべての一般的なUnixシステムには、標準リポジトリに対応するパッケージがあります。
基本的なUnixファンは、このような比較的新しいgrepの代替手段、さらにはPerlスクリプトの形での言及に動揺する可能性が高いです。 ただし、Unixの哲学、特にUnixをIDEとして使用するという考えは、必ずしも現在の問題を解決できる現代的な代替案をあきらめることを意味するとは思わないでしょう。
ファイルのメタデータ
ファイルユーティリティは、拡張子、ヘッダー、およびその他の属性に基づいて、ファイルに関する概要情報を1行で表示します。 これは、なじみのないファイルのグループを検索するためにfindおよびxargsと共に使用する場合に非常に便利です。
$ find | xargs file .: directory ./hanoi: Perl script, ASCII text executable ./.hanoi.swp: Vim swap file, version 7.3 ./factorial: Perl script, ASCII text executable ./bits.c: C source, ASCII text ./bits: ELF 32-bit LSB executable, Intel 80386, version ...
パターン検索
このメモを締めくくるために、テンプレートによる検索とBashブラケットの開示について詳しく調べることをお勧めします。 これは私の別々の記事の主題です。
上記のすべてが、プログラムを作成するときにUnixシェルに非常に強力なファイル管理ツールを提供します。
続行するには...
IDEとしてのUnix:はじめに
IDEとしてのUnix:ファイル
IDEとしてのUnix:テキストの操作
IDEとしてのUnix:コンパイル