特定のファイル形式を含むすべてのディレクトリをどのように削除しますか?

特定のファイル形式を含むすべてのディレクトリをどのように削除しますか?

.svgダウンロードしたファイルを含むフォルダを「圧縮解除」するコマンドラインスクリプトを作成しています。必要なファイルを特定のディレクトリにコピーしたので、すべて削除する必要があります。.svgファイルを含むディレクトリ私には必要ない他の形式やライセンスがいっぱいだからです。どうすればいいですか?

答え1

GNUlyでは、次のようになります。

LC_ALL=C find . -name '*.svg' -type f -printf '%h\0' |
  LC_ALL=C sort -zu |
  xargs -r0 echo rm -rf

findすべてのディレクトリ名を報告する場所.svg 定期的なファイルを削除し、sort -zu重複エントリを削除してからxargs rm削除します。

指定されたディレクトリでファイルを見つけた後でも、指定されたディレクトリ.svgのサブディレクトリでファイルを検索するため、これは非常に効率的ではありません。.svg

現在のディレクトリに.svgファイルが含まれている場合、削除は拒否されます(一部のインクルードおよび拡張シェルのバグ機能を解決するための安全対策としてrm)。rm -rf .rm -rf .*....*

.上記を交換すると、この問題を解決できます"$PWD"

echo必要に応じて機能すると満足している場合は、削除してください。

とともにboshシェル、内蔵機能を使用してこれをより効率的に実行できますfind

has_svg() {
  find "$@" -maxdepth 1 -name '*.svg' -type f -call return 0 \;
  return 1
}

find . -type d -call 'has_svg "$1"' {} \; -prune -exec echo rm -rf {} +

答え2

GNU find では、find で find を使用して、まず低レベルで始まるディレクトリを調べてから、ディレクトリに少なくとも 1 つの .svg ファイルが含まれていることを確認します。我々はそのようなディレクトリを削除します。

$ find . -depth  ! -name . -type d  \
    -exec sh -c '
      N=$#
      for d do
        test "x$(find "$d/." -maxdepth 1 -type f -name "*.svg" -print -quit)" != "x" &&
          set -- "$@" "$d"
      done
      shift "$N"; rm -rf ${1+"$@"}
 ' find-sh {} +

関連情報