質問

質問

質問

現在タスクリスト私はいくつかの(非常に多くの)フォルダを持っていますが、そのいくつかは100,000以上の多数のファイルを含んでいます。

私の目標は、10,000を超えるファイルを含むフォルダのみをインポートし、上記のファイルをfolderName10001.ext削除することです(ここに含まれるfolderNameフォルダの実際の名前は何ですか?extどの拡大する)。

取られたアプローチ

nameFolder numberOfFilesprintを使用しようとしています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. 1行にどのように表示できますかnameFolder numberOfFiles
  2. >を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たいならfindbashバックティック、それから私は必要です。脱出するそれ。

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

おすすめ記事