この文字セットで終わらないすべてのサブディレクトリで、この文字セットで終わるすべてのファイルを一覧表示します。

この文字セットで終わらないすべてのサブディレクトリで、この文字セットで終わるすべてのファイルを一覧表示します。

次のファイルをどのようにリストしますか?x、y、z次に終わらないサブディレクトリからx、y、z

答え1

ドロップを完全に防ぎ、深さが*[xyz]2の通常のファイル(find a/x、nor ax/xnor、2つのディレクトリを超えない)の場合は、a/bPOSIXly:xa/b/x

LC_ALL=C find . \( ! -name '*[xyz]' -o -prune \) \
  -path './*/*' -prune -type f -name '*[xyz]'

これは次のとおりです。

printf '%s\n' *[!xzy]/*[xyz]

とりわけ、隠しディレクトリと隠しファイルを探し、ディレクトリへのシンボリックリンクは見つからず、通常のファイルのみを探します。

*[xyz]任意の深さの一般的なファイルを探したい場合直接親ディレクトリはGNUで終わりませんxyz(したがってx、、a/xa/b/x見つかりますがnorはx/b/x見つかりません)。x/xa/x/xfind

LC_ALL=C find . -regex '.*[^xyz]/[^/]*[xyz]' -type f

そしてzsh

setopt extended_glob
printf '%s\n' **/*[xzy]~*[xyz]/[^/]#(D.)

POSIX的に:

LC_ALL=C find . -name '*[xzy]' -type f -exec sh -c '
  for f do
    case ${f%/*} in
      *[xzy]) ;;
      *) printf '%s\n' "$f"
    esac
  done' sh {} +

サブディレクトリでも内部をまったく見たくない場合*[xyz](つまり、見たくない場合x/a/x) 次のようになります。

find . -name '*[xyz]' -prune -type f

-prunefindディレクトリに入らないように指示し、trueを返します。

または以下を使用してzsh

setopt extended_glob
printf '%s\n' (*[^xyz]/)#*[xyz](D.)

答え2

1

次のファイルにのみ使用できます。みんな任意の深さのサブディレクトリ:

(スティーブンチェイザーズ以降)

 find . -name '*[xyz]' -prune -type f

2

深さ2のサブディレクトリにのみあるファイルの場合は、次のことを試してください。

(標準以外のオプションも含まれています。まだおおよその理解で省略できません。詳細についてはコメントを参照してください。)

find . -mindepth 2 -maxdepth '2' -wholename "./*[^xyz]/*[xyz]" -type f 2>/dev/null

findファイルを探す

.findに現在のディレクトリから開始するように指示する

-mindepth 2検索は現在のディレクトリ1レベルの深さから開始する必要があることを示します。

-maxdepth 2検索が現在のディレクトリより 1 レベル深く終了する必要があることを示します。

-wholenameファイルパス定義値./*[^xyz]/*[xyz]は質問で定義されています。

-type ffindにファイルのみを探すように指示する

2>/dev/nullエラーメッセージを印刷しないように検索に指示する

サム

ファイルだけでなくディレクトリも必要な場合は、次の方が簡単です。

ls -d *[^xyz]/*[xyz]

lsファイルとディレクトリを一覧表示するために使用されます。

ls -dディレクトリにコンテンツを表示しないlsオプションを含める-d

修正する

ファイル拡張子を含めずにファイル名の末尾に検索条件を変更する方法があると思います。検索するとファイルが表示されますfile.abの代わりに.abc

これにより、現在のディレクトリにリストが表示されます。

ls -d *[xyz].???

Linuxでは、思うようにファイルに拡張子がありません。拡張子はファイル名の一部です。前のコマンド、特に最初のコマンドのすべてを書き換えるのは少し複雑です。

1.

(今まで思い出したものの中で最高です。)

find . -path '.*[^xyz]/*[xyz].???' -type f | grep -v [xyz]/

2.

find . -mindepth 2 -maxdepth '2' -wholename "./*[^xyz]/*[xyz].???" -type f 2>/dev/null

三。

ls -d *[^xyz]/*[xyz].???

関連情報