2

意味を理解しようとしているかなり大きなファイルがあります。du -ah コマンドを使用して、多数のファイルを含むディレクトリ構造全体のリストを生成しました。結果には、基本的に、特定のフォルダーの下にあるすべてのフォルダーと、フォルダー内の結果のファイルがプレーンテキスト形式で一覧表示されます。

例えば:

4.0G    ./REEL_02/SCANS/200113/001/Promise Pegasus/BMB 10/RED EPIC DATA/R3D/18-09-12/CAM B/B119_0918NO/B119_0918NO.RDM/B119_C004_0918XJ.RDC/B119_C004_0918XJ_003.R3D
3.1G    ./REEL_02/SCANS/200113/001/Promise Pegasus/BMB 10/RED EPIC DATA/R3D/18-09-12/CAM B/B119_0918NO/B119_0918NO.RDM/B119_C004_0918XJ.RDC/B119_C004_0918XJ_004.R3D
15G ./REEL_02/SCANS/200113/001/Promise Pegasus/BMB 10/RED EPIC DATA/R3D/18-09-12/CAM B/B119_0918NO/B119_0918NO.RDM/B119_C004_0918XJ.RDC

同じファイル名(通常は各行の最後の 16 文字 + 拡張子)の複数のレコードがあるかどうか、およびそのような重複したエントリが存在するかどうかを識別するのに役立つ、実行できるコマンドまたは使用できるユーティリティはありますか?パス全体 (フルライン) を別のテキスト ファイルに書き出して、スクリプトなどを使用して、NAS から重複ファイルを見つけて移動できるようにします。

平文ファイル自体が5.2Mbの場合、これを行うのは非常にストレスがかかるので、私に知らせてください:)

4

4 に答える 4

0

以下は、現在のサブディレクトリを ( を使用して) スキャンし、find複製ファイルへのフル パスを出力します。重複ファイルの削除/移動など、別のアクションを実行するように適応させることができます。

while IFS="|" read FNAME LINE; do
    # FNAME contains the filename (without dir), LINE contains the full path
    if [ "$PREV" != "$FNAME" ]; then
        PREV="$FNAME"  # new filename found. store
    else
        echo "Duplicate : $LINE"  # duplicate filename. Do something with it
    fi
done < <(find . -type f -printf "%f|%p\n" | sort -s)

試すには、それをコピーして bash シェルに貼り付けるか、スクリプトとして保存します。

ご了承ください:

  • が原因でsort、ループが始まる前にファイルのリストをメモリにロードする必要があるため、返されるファイルの数によってパフォーマンスが影響を受けます。
  • の後にファイルが表示される順序は、最初に出現したファイルがオリジナルsortと見なされるため、どのファイルが重複として扱われるかに影響します。オプションは安定した並べ替えを保証します。つまり、順序は によって決定されます。-sfind

堅牢性の低い堅牢なアプローチによるより単純なアプローチは、次のようなものになります。

find . -type f -printf "%20f %p\n" | sort | uniq -D -w20 | cut -c 22-

最長のファイル名が 30 文字であると仮定すると、エントリが重複しているすべてのファイルが出力されます。出力は、上記のソリューションとは異なり、同じ名前のすべてのエントリが一覧表示されます (N-1上記のエントリではありません)。

実際のケースに一致するように、、およびコマンドfinduniq数字を変更する必要があります。cut数値が小さすぎると、誤検知が発生する可能性があります。

find . -type f -printf "%20f %p\n" | sort | uniq -D -w20 | cut -c 22-
----------------------------------   ----   ------------   ----------
                |                      |          |               |
   Find all files in current dir       |          |               |
   and subdirs and print out           |    print out all         | 
   the filename (padded to 20          |    entries that          | 
   characters) followed by the         |    have duplicates       | 
   full path                           |    but only look at      |  
                                       |    the first 20 chars    |
                                       |                          |
                                 Sort the output          Discard the first
                                                          21 chars of each line
于 2013-05-20T08:48:09.680 に答える
0

fslint を探していると思います: http://www.pixelbeat.org/fslint/

重複ファイル、壊れたリンクなどを見つけることができます。

于 2013-05-20T12:17:06.653 に答える