web-dev-qa-db-ja.com

「-find」とともに使用した場合、「-ls」は何をしますか?

man findによると:

-ls

真;現在のファイルをls -dils形式で標準出力にリストします。環境変数POSIXLY_CORRECTが設定されていない限り、ブロック数は1Kブロックです。この場合、512バイトのブロックが使用されます。ファイル名の異常な文字がどのように処理されるかについては、NUSUAL FILENAMESセクションを参照してください。

ls -dilsの部分がわかりません。

man lsには、「-dリストディレクトリ自体であり、内容ではありません」。

3つの.pngファイルを含むフォルダーを考えてみます。

$ ls
01-default.png  02-jungle.png  03-snow.png
$ 

私は得る

$ find . -type f -ls
 12983011     28 -rw-rw-r--   1 dkb    dkb       25964 Mar 10 17:28 ./01-default.png
 12982994     24 -rw-rw-r--   1 dkb    dkb       21857 Mar 10 17:28 ./03-snow.png
 12983031     28 -rw-rw-r--   1 dkb    dkb       25964 Mar 10 17:28 ./02-jungle.png
$

ただし、-lsls -dilsと同じ意味である場合、ls -dilsと同様のものが表示されますが、取得するのは

$ ls -dils
13631944 4 drwxrwxr-x 2 dkb dkb 4096 Aug 30 21:22 .
$ 

一方、ls -ilsは、find-lsで使用した場合に得られるものに似ています。

$ ls -ils
total 80
12983011 28 -rw-rw-r-- 1 dkb dkb 25964 Mar 10 17:28 01-default.png
12983031 28 -rw-rw-r-- 1 dkb dkb 25964 Mar 10 17:28 02-jungle.png
12982994 24 -rw-rw-r-- 1 dkb dkb 21857 Mar 10 17:28 03-snow.png
$ 

ですから、man findページにタイプミスがあるのか​​、質問の冒頭で引用した部分のls -dilsが本当にls ilsなのか疑問に思っていました。

1
DK Bose

見つかったファイルごとに-lsアクションを指定したfindコマンドはそのファイルを置き換えたときにこのコマンドが表示するものと同様の形式で表示されますpathそのファイルのパス:

ls -dils path

つまり、-lsを指定したfindは、start withls -dilsを実行する多くのコマンドを実行するのと同じで、見つかったファイルごとに1つです。 notは、パス引数なしでこの実際のコマンドを実行するのと同様です。

ls -dils

lsコマンドは、パス引数なしで実行すると特別な動作を示します。単一のパス引数.が渡されたかのように動作します。 findコマンドと-lsの動作をパス引数なしのlsコマンドの動作と比較してきましたが、その動作をlswithパス引数の動作と比較する必要があります。たとえば、これを試してください:

ls -dils ./*

(以下で説明するように、lsはその出力をソートするため、さらに良い比較は、各filenameに対して1つずつ、多くの個別のls -dils ./filenameコマンドと比較することになります。)

これらの特定のファイルの場合、出力は-dがあってもなくても同じです。ただし、findはディレクトリを検索できます。ディレクトリを作成し、-dls -dils ./*の両方を試すことにより、ls -dils ./*オプションがある場合とない場合のlsコマンドの違いを確認できます。例えば:

ek@Cord:~/tmp$ touch a b c
ek@Cord:~/tmp$ mkdir d
ek@Cord:~/tmp$ ls -dils ./*
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./c
 25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ ls -ils ./*
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./c

./d:
total 0

find with -lsは、多くの個別のls -dils pathコマンドを実行するのと似ているであるため、特定のlsコマンドと同じように動作するわけではありません。 (-somewhatls -dils paths...と同じように動作しますが、-paths...findが検出したすべてのパスですが、lsコマンドが出力を並べ替えるので、これと似ているわけではありませんなので、結果はしばしば異なる順序で表示されます。)


これを確認するもう1つの方法は、-lsアクションを含むディレクトリが結果に含まれるfindコマンドを実行し、次に-execアクションを使用する対応するfindコマンドを実行して、さまざまなオプションを指定して実際のlsコマンドを実行することです。例えば:

ek@Cord:~/tmp$ find . -ls
54043195528455285      0 drwxrwxrwx   1 ek       ek            512 Aug 30 12:35 .
147774362773104141      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./a
 71213169107810485      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./b
 23080948090377031      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./c
 25051272927352243      0 drwxrwxrwx   1 ek       ek            512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ find . -exec ls -dils {} \;
54043195528455285 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 .
147774362773104141 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./a
71213169107810485 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./b
23080948090377031 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./c
25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ find . -exec ls -ils {} \;
total 0
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 c
 25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 d
147774362773104141 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./a
71213169107810485 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./b
23080948090377031 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./c
total 0

-dなしで-lsを実行するバージョンでは、abc、およびdに対して表示される最初のエントリは、パス.を使用したfirstlsコマンド実行の出力です。これを確認するには、-okの代わりに-execを使用してみてください(対話的に動作し、各コマンドの前にプロンプ​​トを表示するため、どのコマンドがどの出力を生成するかを明確にします)。

3
Eliah Kagan