大きなツリーの特定の名前のフォルダから特定の拡張子を持つすべてのファイルを削除する方法は?

大きなツリーの特定の名前のフォルダから特定の拡張子を持つすべてのファイルを削除する方法は?

pdf私はその中にたくさんのファイルを含む大きな木を持っています。このツリーからファイルを削除したいが、他の種類のファイルもあるサブフォルダpdfからのみ削除したいと思います。このサブフォルダには他のサブフォルダはありません。pdfrules/rules/rules/

たとえば、私はこのような木を持っています。 「ソース」の下のすべての内容

  source/
         A/
            rules/*.pdf, *.txt, *.c,etc..
            etc/
         B/
            keep_this.pdf                
            rules/*.pdf
            whatever/
         C/ 
            D/
               rules/*.pdf
               something/

など。どこにもファイルはありますが、他の場所は削除せず、名前付きフォルダ内のすべてのファイルpdfのみを削除したいと思います。pdfrules/

使うべきだと思います。

  cd source
  find  / -type d -name "rules"  -print0 | xargs -0 <<<rm *.pdf?? now what?>>>

しかし、名前付きのすべてのサブフォルダのリストをインポートした後に何をすべきかわかりません。rules/

助けてくれてありがとう。

Linuxミントから。

答え1

私はfind他のものの中で一つをしますfind。たとえば、次のコマンドラインを実行して、削除するファイルを一覧表示します。

$ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print ';'

次にリストを確認し、次の操作を行います。

$ find /path/to/source -type d -name 'rules' -exec find '{}' -mindepth 1 -maxdepth 1 -type f -iname '*.pdf' -print -delete ';'

答え2

拡張globとnull globをサポートするシェルを使用してくださいzsh。たとえば、次のようになります。

for d in ./**/rules/
do
set -- ${d}*.pdf(N)                               
(( $# > 0 )) && printf %s\\n $@
done

またはbash:

shopt -s globstar
shopt -s nullglob
for d in ./**/rules/
do
set -- "${d}"*.pdf
(( $# > 0 )) && printf %s\\n "$@"
done

結果が満足のいくものprintf %s\\nに変更してください。rm


GNU/Linux を使用しているので、以下を実行することもできます。

find . -type f -regextype posix-basic -regex '.*/rules/[^/]*.pdf' -delete

-deleteテストを実行したい場合は削除してください。

答え3

最も簡単なこと

find source -name '*.pdf' -path '*/rules/*.pdf' -exec rm '{}' +

なぜ最初のですか-name?なぜならそれはより速くなるからです。+複数のパラメータで;1つを実行するのではなく、1つrmのパラメータで複数を実行してください。したがって、より少ない数のプロセスが生成される。 Bashでは引用せずに脱出できます{}

答え4

bashスクリプトを使用してこれを行うことができます(最善の方法ではありません)。

#!/bin/bash

# Don't screw us up with spaces!
IFS=$'\n'; set -f

DIRS=$(find . -type d -name "rules")

for i in $DIRS; do
  set +f
  rm $i/*.pdf
done
set +f

その後、コマンドで見つかったディレクトリを繰り返し、find各ディレクトリの下のpdfファイルを削除します。

この行は、IFS=$'\n'ファイル名のスペースを処理し、set -fワイルドカードを処理するためのものです。もちろん、これはファイル名に改行文字がないと仮定します。これにより、ソリューションがより複雑になります。

関連情報