100未満(または200ファイル)未満のファイルを含むサブディレクトリを見つけて削除するにはどうすればよいですか?
次のコマンドを見つけて使用しましたが、リストされているサブディレクトリを削除する方法がわかりません。 (これらのフォルダとサブディレクトリは1000以上ありますが、手動ではできません。)
find . -maxdepth 5 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | awk '$NF<=10'
ありがとうございます!
答え1
以下であなたの質問に答えましたが、このコマンドを使用するときは非常に注意する必要があることを強調したいと思います。生ファイルの出力awk
がにパイプされますrm -rf
。これは、コマンドがリストされているすべてのフォルダを強制的に削除することを意味します。
ほとんどの場所でこのプログラムを実行すると、重大な問題が発生したり、システムに不可逆的な破損を引き起こす可能性があるため、このプログラムを実行する場所に注意する必要があります。
find . -maxdepth 5 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; -print0 | awk '$NF<=10' | xargs rm -rf
元のコマンドの出力はにパイプされ、元の出力xarge rm -rf
をxargs
他のプログラム(この場合)の引数に変換しますrm
。
rm
使用している2つのスイッチのマンページから取得しました。
-f, --force
ignore nonexistent files, never prompt
-r, -R, --recursive
remove directories and their contents recursively
直接パイピングは、rm
その形式のファイルまたはフォルダ名を受け取るとは思わないため、機能しません。
答え2
存在するzsh
:
for d (**/*(Nod/))
()(($#)) $d/*(ND.Y100[100]) ||
()(($#)) $d/*(ND/Y1) ||
rm -rf -- $d
100を超える一般ファイルを含まず、サブディレクトリも含まない非表示のディレクトリは削除されます。これは深さ優先であるため、ディレクトリに削除するサブディレクトリがある場合、そのディレクトリが削除される可能性があります。
**/
すべてのレベルのサブディレクトリと一致(Nod/)
//(NDoN.[100])
:(ND/Y1)
他の条件に従ってglobをさらに修飾するために使用されるglob修飾子:N
:nullglob:一致するものがない場合は、致命的なエラーとして扱うのではなく、globがnullに拡張されるようにしてください。D
:dotglob:隠しファイルを無視しないでくださいD
。od
:o
rderd
epthから先に(それらがある点より先に出る)oN
:N
面倒なo
リストを並べ替える必要はありません。/
: ファイル形式の制限目次.
: ファイル形式の制限定期的な。^/
以下を除くすべての種類のファイルを考慮するように変更されました。目次代わりに。Y1
/Y100
: 1/100 一致後に検索を停止し、並べ替えもしません。[100]
:100番目の一致Y100[100]
のみを選択します。 100を超える場合は、結果をファイルに保存するか、それ以外の場合はリスト[100]
に対して単独で使用するよりも効率的な方法ですべての一致を見つけます。並べ替えて100番目の項目を選択します。一つ。
(){body} args
args
:パラメータを使用して匿名関数を実行します。(($#))
匿名関数の本文は算術式なので、式がゼロ以外の数字で評価された場合はtrueが返されます。したがって、ここでif$#
匿名関数の引数の数は0ではありません。
答え3
以下のスクリプトは汚れているが効果的な解決策です。
コンテンツが削除されるため、仕事用コンピュータに適用する前に、テスト環境でこのスクリプトを実行してください。
cd desired_directory
for i in `find . -maxdepth 1 -type d | grep "/"`
do
cd $i;
j=`echo \`ls -l | wc -l\` | bc`
[ $j -lt "100" ] && echo "Lesser than 100 files/directories in $i"
cd ../
done
echo
ここでドアをrm -rf
or に置き換える必要がありますmv
。