
質問
現在タスクリスト私はいくつかの(非常に多くの)フォルダを持っていますが、そのいくつかは100,000以上の多数のファイルを含んでいます。
私の目標は、10,000を超えるファイルを含むフォルダのみをインポートし、上記のファイルをfolderName10001.ext
削除することです(ここに含まれるfolderName
フォルダの実際の名前は何ですか?ext
どの拡大する)。
取られたアプローチ
nameFolder numberOfFiles
printを使用しようとしていますbash
。
find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {}; ls {} | wc -l" \;
これはうまくいきますが(例フォルダの場合acer
)、出力は次のようになります。
./acer
6058
フォルダごとに1行の出力が必要です。
find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {} `ls {} | wc -l`" \;
説明するls: cannot access {}: No such file or directory
。
質問
- 1行にどのように表示できますか
nameFolder numberOfFiles
? - >を
folderName/folderName#.ext
使用してすべてのファイルを削除する簡単な方法はありますか?#
10000
質問2
詳細は、現在の状況を理解するのに役立ちます。
次のツリーを含むフォルダがあります。
.
├── a
│ ├── a1.ext
│ ├── a2.ext
│ ├── a3.ext
│ └── a4.ext
├── b
│ ├── b1.ext
│ ├── b2.ext
│ ├── b3.ext
│ └── b4.ext
└── c
├── c1.ext
├── c2.ext
├── c3.ext
└── c4.ext
より大きいすべての数字を削除したいです2
。 (私の場合はしきい値がに設定されます10000
。)
回答1
それはすべてですWHO説明する何(ありがとうございます。@ブラチリーコメントに関する提案)。
を入力しているので、bash
まずbash
何を入力しているのかを説明します。送りbash
たいならfind
bash
バックティック、それから私は必要です。脱出するそれ。
find . -maxdepth 1 -type d -name 'acer' -exec sh -c "echo {} \`ls {} | wc -l;\`" \;
これは私に与える
./acer 6058
find . -maxdepth 1 -type d -name 'acer' -exec sh -c 'echo {} `ls {} | wc -l`' \;
うまくいきます("
に置き換えることに注意してください'
)。
回答2
これは以下で提供されます。ウォルターA、これは受け入れられた回答この質問について。
追加エラー(以下の例)...
black: 390120
./clean.sh: line 6: /bin/ls: Argument list too long
rm: missing operand
Try 'rm --help' for more information.
leather: 118240
./clean.sh: line 6: /bin/ls: Argument list too long
rm: missing operand
Try 'rm --help' for more information.
わかりました。解決しました。
ls -d */ | cut -d/ -f1 | while read dir; do
COUNT=$(ls $dir | wc -l);
if [ ${COUNT} -gt 10000 ]; then
echo "$dir: ${COUNT}" ;
for i in `seq 10001 ${COUNT}`; do
rm ${dir}/${dir}${i}.*
done
fi
done
答え1
$
バックティックが元のシェルから解釈されないように、二重引用符の代わりに一重引用符を使用してください。
find . -maxdepth 1 -type d -name 'acer' -exec sh -c 'echo {} $(ls {} | wc -l)' \;
2番目の質問の場合は、ディレクトリ名をパラメータとして使用する別のスクリプトに実行したいアクションを入力します。次に、次のようにします。
find . -maxdepth 1 -type d -name 'acer' -exec ./scriptname {} \;
これを行うと-exec sh -c
。
答え2
書くことができます
ls -d */ | while read dir; do
echo "$dir: $(ls $dir | wc -l)"
done
ファイル名番号の前にゼロがない場合は、試してみてください。
ls -d */ | cut -d/ -f1 | while read dir; do
COUNT=$(ls $dir | wc -l);
echo "$dir: ${COUNT}" ;
if [ ${COUNT} -gt 10000 ]; then
ls ${dir}/${dir}?????*.ext | grep -v ${dir}/${dir}10000.ext | xargs rm
fi
done
ファイル名の前にゼロがある場合は、別のアプローチを取ることができます。
ls -d */ | cut -d/ -f1 | while read dir; do
ls ${dir}/${dir}*.ext | tail -n +10001 | xargs rm
done
編集:lsコマンドにdir + filenameを含め、cut -d/ -f1 |
末尾/を切り捨てる機能を追加しました。