
pdf
私はその中にたくさんのファイルを含む大きな木を持っています。このツリーからファイルを削除したいが、他の種類のファイルもあるサブフォルダpdf
からのみ削除したいと思います。このサブフォルダには他のサブフォルダはありません。pdf
rules/
rules/
rules/
たとえば、私はこのような木を持っています。 「ソース」の下のすべての内容
source/
A/
rules/*.pdf, *.txt, *.c,etc..
etc/
B/
keep_this.pdf
rules/*.pdf
whatever/
C/
D/
rules/*.pdf
something/
など。どこにもファイルはありますが、他の場所は削除せず、名前付きフォルダ内のすべてのファイルpdf
のみを削除したいと思います。pdf
rules/
使うべきだと思います。
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
ワイルドカードを処理するためのものです。もちろん、これはファイル名に改行文字がないと仮定します。これにより、ソリューションがより複雑になります。