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

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

次のファイルをどのようにリストしますか?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.)

おすすめ記事