特定のファイルのみを含むディレクトリを見つける方法

特定のファイルのみを含むディレクトリを見つける方法

役に立たないファイル(たとえば、、、、、など)を含むいくつかのディレクトリがあります*.tmpdesktop.iniThumbs.db.picasa.ini

すべてのドライブを検索して一部のファイルのみを含むディレクトリを見つけるにはどうすればよいですか?

ベストアンサー1

、および/または以外の名前がない*.tmpすべてのdesktop.iniディレクトリThumbs.dbを見つけるには、次の手順を実行します.picasa.ini

find . -type d -exec bash -O dotglob -c '
    for dirpath do
        ok=true
        seen_files=false
        set -- "$dirpath"/*
        for name do
            [ -d "$name" ] && continue  # skip dirs
            seen_files=true
            case "${name##*/}" in
                *.tmp|desktop.ini|Thumbs.db|.picasa.ini) ;; # do nothing
                *) ok=false; break
            esac
        done

        "$seen_files" && "$ok" && printf "%s\n" "$dirpath"
    done' bash {} +

findこれは、現在のディレクトリの下(含まれている)のディレクトリを見つけてシェルスクリプトに渡すために使用されます。

シェルスクリプトは指定されたディレクトリパスを繰り返し、各ディレクトリパスに対して*その中で展開されます(隠し名前をキャプチャするようにdotglobシェルオプションを設定します)。bash

次に、結果の名前のリストを繰り返して、検索したい特定のパターンと名前と一致させます(ディレクトリを無視)。もし見つけたらその他名前がリストと一致しない場合(from has was)okに設定され、内部ループから外れます。falsetrue

次のタイプを除くすべてのタイプのファイルを見ると、このseen_files変数は次のようになります。true目次(またはディレクトリへのシンボリックリンク)。この変数は、他のサブディレクトリのみを含むサブディレクトリを報告するのを防ぐのに役立ちます。

$seen_files次に、and $oktrueまたは)を実行してfalse両方の場合、trueそのディレクトリに少なくとも1つの一般的なファイルが含まれていることを意味します。リスト内のファイル名のみを含める、ディレクトリのパス名を印刷します。

変える

set -- "$dirpath"/*
for name do

あなたは明らかにこれを行うことができます

for name in "$dirpath"/*; do

代わりに。

テスト:

$ tree
.
`-- dir
    |-- Thumbs.db
    `-- dir
        |-- file.tmp
        `-- something

2 directories, 3 files

findここでコマンドが実行され、出力が生成されます...)

./dir

つまり、ディレクトリ./dirにはリストの名前(ディレクトリを無視)だけが含まれ、./dir/dir他のコンテンツも含まれます。

[ -d "$name" ] && continueコードから削除すると、リスト()にない名前が./dir含まれているため、ディレクトリが見つかりません。dir

おすすめ記事