
次のファイルをどのようにリストしますか?x、y、z次に終わらないサブディレクトリからx、y、z?
答え1
ドロップを完全に防ぎ、深さが*[xyz]
2の通常のファイル(find a/x
、nor ax/x
nor、2つのディレクトリを超えない)の場合は、a/b
POSIXly:x
a/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/x
はa/b/x
見つかりますがnorはx/b/x
見つかりません)。x/x
a/x/x
find
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
-prune
find
ディレクトリに入らないように指示し、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 f
findにファイルのみを探すように指示する
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].???