同じファイルの名前を同じ名前に変更して重複エントリを削除します。

同じファイルの名前を同じ名前に変更して重複エントリを削除します。

私はグラフィックデザインの分野で働いています。さまざまなウェブサイトから多くのファイル(EPS文書、PSDファイルなど)をダウンロードしました。

さまざまなWebサイトで提供されているため、10を超えるWebサイトからダウンロードした後、同じサイズの同じファイルがたくさん作成され、すべてが同じですが、ファイル名が異なります(同じファイルのコピー2〜4個)。重複を排除するために手動で1つずつ開くには非常に時間がかかります

ダウンロードしたすべてのファイルの名前を別のファイルの一意の名前に変更する方法があることを願っています(新しい名前が説明的でなくても大丈夫です)。

たとえば、2つの同じファイル(nice-sun.epsサイト1からダウンロードしたファイルと678.epsサイト2からダウンロードしたファイル)です。名前を変更すると、ファイル名は同じになります。

答え1

このコマンドは、すべてのファイルの名前をその内容の md5sum に変更します。つまり、同じ内容のファイルは同じ名前を持ちます。

for f in *; do mv $f $(md5sum $f | cut -d " " -f 1); done

コマンドからに置き換えることができますmd5sumsha1sum

このデモでは、名前の変更を確認できるように-vいくつかの項目を追加しました。mv

$ echo 1 > a
$ echo 2 > b
$ echo 1 > c
$ ls -1
a
b
c
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
`a' -> `b026324c6904b2a9cb4b88d6d61c81d1'
`b' -> `26ab0db90d72e28ad0ba1e22ee510510'
`c' -> `b026324c6904b2a9cb4b88d6d61c81d1'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1

一部のファイルには同じファイル名があり、他のファイルにはないディレクトリからこのコマンドを安全に実行することもできます。

$ echo 1 > d
$ echo 2 > e
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1
d
e
$ for f in *; do mv -v $f $(md5sum $f | cut -d " " -f 1); done
mv: `26ab0db90d72e28ad0ba1e22ee510510' and `26ab0db90d72e28ad0ba1e22ee510510' are the same file
mv: `b026324c6904b2a9cb4b88d6d61c81d1' and `b026324c6904b2a9cb4b88d6d61c81d1' are the same file
`d' -> `b026324c6904b2a9cb4b88d6d61c81d1'
`e' -> `26ab0db90d72e28ad0ba1e22ee510510'
$ ls -1
26ab0db90d72e28ad0ba1e22ee510510
b026324c6904b2a9cb4b88d6d61c81d1

まだハッシュされたファイルのハッシュを計算します。そのため、ファイルが大きい場合は、災害を防ぐことをお勧めします。

答え2

rename-hash以下は、拡張子を変更せずにファイル名をハッシュ合計に置き換えるために使用するスクリプトです。名前を変更するファイルのリストを引数として使用します。-nテストを実行するための最初のパラメータとして使用されます。

#!/bin/sh

unset DRY
[ "$1" == "-n" ] && { DRY=1; shift; }

for i in $@; do

if [ -f "$i" ]; then

HASHSUM=$(md5sum "$i" | sed 's/\(..........\).*/\1/')
DIR=$(dirname "$i")
BASE=$(basename "$i")
EXT=$(echo "$BASE" | sed -n 's/[^.]*\(\..*\)/\1/p')
TARGET="$DIR"/"$HASHSUM""$EXT"
if [ "$TARGET" != "$DIR/$BASE" ]; then
   if [ -n "$DRY" ]; then
       echo will rename "$i" to "$TARGET"
   else
       mv "$i" "$TARGET"
   fi
fi

fi

done

例:

$ rename-hash -n *
will rename test.pdf to ./f604d0d6ad.pdf
will rename images.tar.gz to ./d41d8cd91b.tar.gz

答え3

重複項目を見つけるためのユーティリティがあります。 findとmd5sumを使用できますが、時間がかなりかかることがあります。

普通に使うレプリカそのような理由で。すべての重複項目を見つけて、その名前を標準出力として印刷できる場合。後で出力を解析し、必要に応じてすべてのファイルの名前を変更または削除することもできます。

関連情報