役に立たないファイル(たとえば、、、、、など)を含むいくつかのディレクトリがあります*.tmp
。desktop.ini
Thumbs.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
に設定され、内部ループから外れます。false
true
次のタイプを除くすべてのタイプのファイルを見ると、このseen_files
変数は次のようになります。true
目次(またはディレクトリへのシンボリックリンク)。この変数は、他のサブディレクトリのみを含むサブディレクトリを報告するのを防ぐのに役立ちます。
$seen_files
次に、and $ok
(true
または)を実行して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