単一(特定)ファイルを持つすべての空のディレクトリとディレクトリを検索する

単一(特定)ファイルを持つすべての空のディレクトリとディレクトリを検索する

すべての空のディレクトリと.DS_StoreMac生成ファイルのみを含むディレクトリを削除するシェルスクリプトを作成しようとしています。電子を簡単にできる

find -depth -type d -empty

しかし、次のようなディレクトリを見つける方法がわかりません。ただ .DS_Store

独自の再帰検索機能を作成せずにこれを行う簡単な方法はありますか?

ベストアンサー1

POSIX sh+を探す

これはPOSIX findとPOSIX shにのみ依存するソリューションです。すべてのディレクトリを一覧表示し、名前付きエントリのみを含むディレクトリをフィルタリングします.DS_Store

find . -type d -exec sh -c '
    cd "$0" &&
    for x in * .[!.]* ..?*; do
      if [ "$x" = ".DS_Store" ]; then continue; fi;
      if [ -e "$x" ] || [ -L "$x" ]; then exit 1; fi;
    done' {} \; -print
  • 私はfindすべてのディレクトリを再帰的に列挙するために使用します。
  • sh各ディレクトリでいくつかのシェルコードを実行する呼び出しを実行します。
  • このforループはディレクトリ内のすべてのファイルを列挙します。
  • ループ本文をスキップします.DS_Store
  • これら 3 つのパターンのそれぞれがどのファイルにも一致しない場合は、変更されていません。[ -e "$x" ] || [ -L "$x" ]壊れたシンボリックリンクを含むすべてのファイルをキャプチャします。一致しない唯一の理由は、パターンが同じままであるためです。
  • exit 1したがって、ファイル以外のファイルがある場合はシェルフラグメントが実行され.DS_Store、それ以外の場合は成功するとゼロが返されます。
  • 名前印刷以外の操作を実行するには、-print次のように変更します。-exec …

ジッシュ

zshの解決策は次のとおりです。echo実行したいコマンドに変更します。

setopt extended_glob
echo **/*(/DNe\''a=($REPLY/^.DS_Store(DNY1)); ((!#a))'\')
  • **/*すべてのファイルを再帰的に列挙します。
  • とともにグローバル予選 /**/*(/)すべてのディレクトリを再帰的に列挙します。
  • Nglob修飾子は、一致するものがない場合は空のリストを取得することを保証します(zshはデフォルトでエラー信号を送信します)。
  • glob修飾子はDドットファイルを含みます。
  • glob修飾子は、一致する各ファイル名に対して機能し、一致を正常なファイル名に制限します。変数を使用してファイル名を参照できます。e\''CODE'\'CODECODECODE$REPLY
  • ^.DS_Store呼び出されていないファイルと一致します.DS_Store
  • それだけです。パスワード.DS_Storeゼロ以外のファイル数に一致する項目に一致を制限します。
  • glob修飾子はY1一致数を1つに制限します(これは効率の向上にすぎません)。

Python

これはPythonのソリューションです(2と3の両方で動作します)。一列に圧縮されているにもかかわらず、構造は非常に明確です。

python -c 'import os; print("\n".join([path for path, dirs, files in os.walk(".") if dirs == [] and files in ([], [".DS_Store"])]))'
  • os.walkその引数の下にディレクトリのリストを繰り返し返します。各ディレクトリにpath(ディレクトリパス)、dirs(サブディレクトリリスト)、およびfiles(ディレクトリ自体がディレクトリではないディレクトリのファイルリスト)を含むトリプルを作成します。
  • [… for … in os.walk(…) if …]os.walkフィルタリングされた結果
  • ifこの句は、サブディレクトリがなく、外部にファイルがない場合にのみ要素を保存します.DS_Store
  • スクリプトは、中間行と最後の改行の間に改行を含む許可された要素を印刷します。

おすすめ記事