ディレクトリ内のファイルを検索するために、次の2つのコマンドを見つけました。
最初のコマンドで検索結果が表示されることもありますが、2番目のコマンドを実行することもありました。これら2つのLinuxコマンドセットの違いは何ですか?主な違いについてのみ回答をご記入ください。
ls -ltr file*
:このコマンドは、現在のディレクトリの内容を長いリスト形式(-l
)でリストし、変更時刻(-t
)で逆順にソートします(-r
) file*
で始まるすべてのファイルとディレクトリ。
find ./ -name file*
:このコマンドは、現在の作業ディレクトリとそのすべてのサブディレクトリの下にあるディレクトリ構造全体から、名前がfile*
で始まるファイルとディレクトリを検索します。出力フォーマットは非常に単純です。ファイル/ディレクトリパスのみが1行ずつ出力されます。
主な違い(結論):ls
は現在の作業ディレクトリにのみ適用され、find
は現在の作業ディレクトリから始まるすべてのファイルとサブディレクトリに適用されます。
find
バージョンは、サブディレクトリでその名前に一致するファイルも検索します。
ファイル名パターンでは*
を引用またはエスケープする必要があることに注意してください。パターンがローカルディレクトリのファイルと一致する場合、その名前に展開され、find
はその名前のみを検索します。複数のファイル名と一致する場合、それらの複数のファイル名がfind
呼び出しのパターンを置き換え、find
構文と一致しないため、エラーが発生します。例えば。:
$ cd /etc
$ find . -name pass*
find: paths must precede expression: passwd-
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$ find . -name 'pass*'
./passwd
./passwd-
./pam.d/passwd
./cron.daily/passwd
シェルはどちらかのコマンドが実行される前にファイル名の展開を行うため、結果は現在のディレクトリの内容によって異なります。
必要なものを取得するには、findコマンドで*
を引用符で囲みます。この例を確認してください。
$# First show all the files $# ~/tmp/stack$ find . . ./dir1 ./dir1/FileA ./dir1/FileB ./dir1/FileC ./dir1/filec ./dir2 ./dir2/filea ./dir2/fileb $# $# Following will list nothing because there is no file named File* in the current directory $# ~/tmp/stack$ ls -lR File* ls: cannot access File*: No such file or directory # # Now using find will work because no file named File* exists, file name # expansion fails, so find sees the * on the command line. ~/tmp/stack$ find . -name File* ./dir1/FileA ./dir1/FileB ./dir1/FileC # # I'll create a file named Filexxx # ~/tmp/stack$ touch Filexxx # # ls will work but only list details for Filexxx # ~/tmp/stack$ ls -lR File* -rw-rw-r-- 1 christian christian 0 Apr 21 09:08 Filexxx # # and so will find but probably not as expected because filename expansion works, so actual command executed is find . -name Filexxx # ~/tmp/stack$ find . -name File* ./Filexxx # # now escape the wild card properly, then find will work as expected # ~/tmp/stack$ find . -name File\* ./dir1/FileA ./dir1/FileB ./dir1/FileC ./Filexxx ~/tmp/stack$
ls -ltr
は、現在のディレクトリにファイルが存在する場合にファイルをリストします。 find
はファイルを再帰的に検索します(サブディレクトリでファイルを検索します)
find
コマンドは、initialfilename*
は複数のファイルに展開されます:
$ touch initiala initialb
$ dir -lrt initial*
-rw-rw-rw- 1 user 0 0 2015-04-21 10:17 initialb
-rw-rw-rw- 1 user 0 0 2015-04-21 10:17 initiala
$ find . -name initial*
find: paths must precede expression: initialb
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
そのため、アスタリスクをエスケープする必要があります。
$ find . -name "initial*"
./initiala
./initialb
$ find . -name initial\*
./initiala
./initialb