web-dev-qa-db-ja.com

見つける。 * -exec ll {} \; ->結果が4つではなく1つだけ

Findコマンドを使用して、1つのディレクトリ内のすべてのファイルを検索したいと思います。

find . * -exec ll {} \;

結果は、ファイルごとに4つの(!)結果を示しています。

  • file123
  • ./test/file123
  • file123
  • test/file123

Find-out-of-the-box-commandを使用して(./test/file123などを使用せずに)2番目の結果| grep '^\./'だけを表示することは可能ですか?

最新バージョンのHP/UXを使用しています。

2
MyUserName

findに現在のディレクトリ(.)と、*が展開されるすべてのものを検索するように要求したため、4行の出力が得られます。

現在のディレクトリの場合、findは、検出したものに対してllを呼び出します。これは、現在のディレクトリ、testディレクトリ、およびtestディレクトリ内のファイルです。これはfile123を2回リストします。

次に、*が展開されるすべてのものを検索します。これは、testディレクトリになります。これで、llとその中のファイルでtestが再び使用されます。これにより、ファイルが2回リストされます。

代わりに、通常のファイルを探している場合は、-type fを使用してください。また、デフォルトで見つかったパス名が一覧表示されるため、ll(またはls)を使用してfindから結果を取得する必要はありません。また、検索パスとしてfindに現在のディレクトリ(またはtest)を指定するだけです。

find . -type f

正確な名前がfile123のファイルを探していることがわかっている場合:

find . -type f -name 'file123'

パス名ではなくls -lのような出力が必要な場合:

find . -type f -name 'file123' -ls
5
Kusalananda
_find . * -exec ll {} \;
_

_._と、testサブディレクトリを含む現在のディレクトリ(シェルによって_*_から展開された)内の非表示でないファイルのリストを渡します(これらのファイルのいずれかが_-_または_!_または_(_、_)_ ...というファイルがあった場合、findは構文エラーを報告します)。

つまり、findに、_._だけでなく、testでもファイルを再帰的に検索するように指示していることになります。したがって、findtestを2回検索し、_test/file123_も2回検索します。

llは、_ls -l_を実行するスクリプトであると思います。これは、ファイルの詳細、またはディレクトリタイプのファイルの場合、そのディレクトリ内のすべてのファイルの詳細を一覧表示するツールです(_-d_オプション)。

したがって、llは_./test_とtestを引数として呼び出されます。その場合、ifはそのコンテンツ内のファイルの詳細(_test/file_を含む)をリストします。

そして、それは_./test/file123_と_test/file123_で呼び出されます。

ここでは、次のようにします。

_find . -exec ls -ld {} +
_

(_+_を使用すると、複数のファイルが引数としてlsに渡されます。これにより、より効率的になり、lsでファイルのリストを並べ替えることができます)。

findは、ビットリスト_-ls_として動作する_ls -lsid_述語をサポートする場合もあります。

_find . -ls
_
5

findはすべてのディレクトリを再帰的に検索することに注意してください。
Findはファイルだけでなくディレクトリも返します!

テストディレクトリ内のすべてのファイルを一覧表示する場合、必要なのは次のコマンドだけです。
find test/ -type f

また、何を達成しようとしているのかわかりませんが、findのマンページを確認してください...-exec ll {} \;を使用しており、おそらくfindオプションがあると思います。必要なことを実行します(サイズ、変更日などでファイルをフィルタリングします)

0
pi0tr