特定のディレクトリ内のファイルのみを検索し、bashを使用してサブディレクトリを無視する方法


129

他の同様の質問を調べましたが、概念を把握して、限られた時間で自分の状況に適用できるような質問は見つかりませんでした。特定のファイルを見つけるために単純にfindコマンドを実行していますが、サブディレクトリ内の一部のファイルに同じ名前が付いているため、無視したいのです。助けてくれてありがとう。以下は私が使用しているコマンドです:

興味のあるファイル/パターン:/ dev / abc-scanner、/ dev / abc-cash ....

コマンド:

find /dev/ -name 'abc-*'

返されるもの:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

後者のファイルを無視したい:/dev/.udev / ...


9
特定のサブディレクトリを無視しますか、それともサブディレクトリに降りませんか?後者の場合は、-maxdepth 1オプションを使用します
frankc

@frankc回答として投稿してください。
cnicutar

回答:


202

検索を最初のレベルに制限したい場合は、次のようにすることができます。

 find /dev -maxdepth 1 -name 'abc-*'

...または特に.udevディレクトリを除外する場合は、次のようにできます。

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

上記のすべてのシンボリックリンクが上記のパターンで見つかった場所をリストしたい場合は、パイプを使用するだけですか?find / dev -maxdepth 1 -name 'abc- *'のようなもの| ls -l
suffa

1
xargs代わりに使用する方が良いので、次のようにします。find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lただし、名前に空白が含まれる可能性がある場合は、行う必要がありますfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair

ただし、Stephen Darlingtonの回答が指摘しているように、なぜあなたがそうしないのかls -l /dev/abc-*
わかり

また、シンボリックリンクが指す場所を知りたい場合は、次のようにできますfor x in /dev/abc-*; do readlink -f $x; done
Mark Longair

1
または、サブディレクトリを最初のレベルのみにしたい場合はls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev、少なくとも私のLinuxに/dev/*/*はファイルが含まれていない/dev/.udev/*ため、を省略できますfgrep -v
Tripleee、2011年

9

使用する必要がある特別な理由はありますfindか?を使用lsして、ディレクトリ内のパターンに一致するファイルを検索できます。

ls /dev/abc-*

を使用する必要findがある場合は、-maxdepth 1スイッチを使用して、指定したディレクトリにのみ適用できます。


私はあなたが-maxdepth 1よりもむしろ意味すると思います-maxdepth 0
マークロングエア

5
ここでは、ワイルドカードは重要な部分であり、ではないことに注意してくださいls。シェルがワイルドカードを展開するため、同じファイルをechowcまたは自分が持っているものと同じファイルを見つけることができます。そのfor file in /dev/abc-*; do something with each "$file"; doneため、OPが実際に探しているものである可能性があります。
Tripleee、2011年

1
ああ、私はそれがどの方向にあるのか思い出せません...編集ありがとうございます。また、普遍的ではないことにも注意してください。findたとえば、Solarisバージョンにはありません。
スティーブンダーリントン

@tripleee +1。うん。可能であれば、シェルですべて実行することをお勧めします。
スティーブンダーリントン

1
@MustafaOzturk lsは不必要です。for f in abc*; ...は、あなたが必要とすることすべてです。
スティーブンダーリントン

4

これはあなたが望むことをするかもしれません:

find /dev \( ! -name /dev -prune \) -type f -print

2
はい、これでうまくいきます。-maxdepthは、一部の古いUnixのfindでは実装されていません。
CCTO 2017年

-1
find /dev -maxdepth 1 -name 'abc-*'

私には効きません。それは何も返しません。「。」だけを実行すると それは私が働いているものの下のディレクトリにあるすべてのファイルを私に与えます。

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

「。」で何も返さない 代わりに、ディレクトリ内のすべての「大きな」ファイルのリストと、古いファイルを格納するrootfiles /ディレクトリを取得します。

続けます。これは機能します。

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

どうやら興味のある/dev ディレクトリ意味します。しかし./、必要なだけではありません.。多かれ少なかれ/何を/dev意味するのかを理解した後でも、その必要性は明白ではありませんでした。

「評判」がないのでコメントとして返信できませんでした。


1
あなたは良い答えを与えることで評判を得ます。このstackoverflow.com/conductを
aifrim

コメントを許可されていない理由がいくつかあります。そのため、ここの[回答]セクションにコメントを書き込むことはできません。これを削除してください。
ロブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.