検索からすべてのサブディレクトリを除外

検索からすべてのサブディレクトリを除外

フォルダ内の一部のファイルを見たいのですが、サブディレクトリは見たくありません。

ディレクトリを除外したくないけどみんな

私はこれを試しました~から

find "$dir" -name '*.out' -type d -prune

しかし、結果は何も出てこないということです。助けが必要ですか?

答え1

タスク(すべてのサブディレクトリを除くフォルダ内のファイルを検索)を実行する最も簡単な方法は次のとおりです。

find $dir -maxdepth 1 -type f -name '*.out' -o '.*.out'

@StevenPennyと@RalfFriedlalが書いたように、maxlengthオプションはあなたが探しているものです。

検索マニュアルでは、-maxの深さレベルは、始点より下のほとんどの(非負の整数)ディレクトリレベルに下がります。 -maxlength 0 は、始点自体にのみテストと操作を適用することを意味します。

-type f :一般ファイルを検索しています -name '*.out' -o '.*.out' 。 -oは、または検索に.out拡張子を持つ最終的な隠しファイルを含めることができることを意味します。

申し訳ありません。私の英語力が悪いです。

答え2

マニュアルを見てみましたか?

-maxdepth@StevenPennyがすでに書いたように、あなたが探しているオプションはです。

何も得られない理由の一つは(説明書から)

フル式に-pruneまたは-print以外の操作が含まれていない場合、式全体がtrueのすべてのファイルに対して-printが実行されます。

したがって、あなたの選択が含まれているので、-prune何も暗示されません-print。あなたのコマンドは名前付きディレクトリのみを削除します*.out

本当に使いたい場合は、-prune次のようにします。

find "$dir"/* -type d -prune -o -name '*.out' -print

これはディレクトリ"$dir"/*として使用され、クリーン"$dir"アップされます。これはfind、最大パラメータ長によって制限されないという利点を無効にします。

答え3

findここでは実際にこれがまったく必要ないようです。

for pathname in "$dir"/*.out; do
    [ ! -f "$pathname" ] && continue

    # do whatever you need to do to "$pathname" here
done

テスト後、-f一般"$pathname"ファイルまたは一般ファイルへのシンボリックリンクをポイントします。*ドットで始まるファイル名と一致する項目がないため、隠しファイルはスキップされます(使用可能または使用しない可能性があるdotglobシェルオプションがに設定されていない場合)。bash

そしてfind

find "$dir" -mindepth 1 -type d -prune -o -type f -name '*.out' -print

これ-mindepth 1は起動ディレクトリをクリーンアップしません-type d -prune-printは、見つかったパス名に対して実行したい操作に置き換える必要があります(これは名前で終わる一般的なファイルです.out)。

または、

find "$dir" ! -path "$dir" -type d -prune -o -type f -name '*.out' -print

これは標準findオプションのみを使用し、開始パスと他のすべてのディレクトリをクリーンアップします。

または、

find "$dir" -maxdepth 1 -type f -name '*.out' -print

-maxdepth 1find簡単に言えば、使用はスタートアップディレクトリのサブディレクトリに降りるのをやめます。

-mindepthとオプションは-maxdepth通常利用可能ですが、標準findコマンド、実装にfindこれらの項目がない場合は、シェルループまたは(with)のみをfind使用する代替を使用する必要があります。-prune-path

答え4

そしてzsh

printf '%s\n' $dir/*.out(^/)  # files of any type except directory (excluding
                              # hidden ones)
printf '%s\n' $dir/*.out(-^/) # same but also excludes symlinks to directories
printf '%s\n' $dir/*.out(.)   # regular files only (excluding hidden ones)
printf '%s\n' $dir/*.out(-.)  # regular files or symlinks to regular files
                              # (excluding hidden ones)
printf '%s\n' $dir/*.out(D-.) # same, but include hidden ones.

関連情報