0

100 万を超えるファイルを含むフォルダーがあります。ファイルは、拡張子のみが異なるカップルで提供されます (例: a1.ext1 a1.ext2、a2.ext1、a2.ext2 ...)

このフォルダをスキャンして、(ファイル結合の) この要件を満たしていることを確認する必要があります。一致しないファイルを見つけた場合は、それを削除する必要があります。

私はすでにPythonでそれを行っていますが、7桁のファイル数を扱うとなると非常に遅くなりました..

シェルコマンド/スクリプトを使用してこれを行う方法はありますか?

4

3 に答える 3

1

別の回答に基づいて、次のようなスクリプトを使用できます(ファイルが配置されているのと同じディレクトリにあるはずで、そこで実行する必要があります):

#!/usr/bin/env bash 
THRASH=../THRASH
mkdir "$THRASH" 2> /dev/null

for name in $(ls *.{ext1,ext2} | cut -d. -f1 | sort -u); do
    if [ $(ls "$name".{ext1,ext2} 2> /dev/null | wc -w) -lt 2 ]; then
        mv "$name".{ext1,ext2} "$THRASH" 2> /dev/null
    fi;
done

THRASH変数を変更することで、ペアを持たないファイルの移動先を構成できます。

3.0 GHz と 2 GB の RAM を搭載したデュアル コアPentiumでは、1 回の実行に 63.7 秒かかりました (10000 ペアで、ペアの各メンバーの約 1500 がフォルダーから欠落しています)。

于 2013-03-28T16:33:32.887 に答える
0

Python の方が速いはずです。ただし、bash で試してみたい場合:

for file in $(ls | cut -d. -f1 | sort -u); do
    if [ $(ls $file.* | wc -l) -ne 2 ]; then
        echo "too much extension for $file"
    fi
done

これにより、拡張子が 2 つより多いまたは少ないファイル名が表示されます。

于 2013-03-28T15:37:46.440 に答える
0

これを試してください:

#!/bin/bash

for file in *.ext1 *.ext2
do
  #name is the substring before the '.'
  name=${file%.*}
  #ext is the substring after the '.'
  ext=${file#*.}
  case $ext in
    "ext1")
      sibling="$name.ext2";
      #does it haves a sibling?
      #if it does not,remove the file
      ls | grep $sibling >/dev/null;
      if [ $? -ne 0 ]
      then
        rm $file
      fi;;
    "ext2")
      sibling="$name.ext1";
      #does it haves a sibling?
      #if it does not,remove the file
      ls | grep $sibling >/dev/null;
      if [ $? -ne 0 ]
      then
        rm $file
      fi;;
  esac      
done
于 2013-03-28T17:42:53.407 に答える