私はすべての同様の質問を通過しました+ duffのようないくつかのコマンドラインユーティリティをインストールしましたが、成功しませんでした。
私のImagesディレクトリには、同じ名前で拡張子(jpgとpng)が異なる画像があります。拡張子が異なる重複ファイル名のファイル名を印刷したいだけです。 (例:foo.jpg&foo.png)または少なくとも1つのファイル名(foo)
これまで私はこれらの方法を試しました
find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq
find . -type f \( -name "*.jpg" -o -name "*.png" \)
これらのコマンドのほとんどは、次のいずれかを返しますなし OR すべてのファイル OR 一意ファイル名ですが重複したものではありません。
2番目のコマンドを変更することをお勧めします。
find . -type f -name "*.jpg" | \
while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done
これにより、すべての.jpg
ファイルが検索され、対応する.png
ファイルが存在するかどうかが確認され、拡張子なしのフルパスが表示されます。
.png
ファイルの数がはるかに少ない場合は、これらを検索して、対応する.jpg
ファイルを確認する方が効率的であることに注意してください。
[Ubuntu18.04.1でbash
でテスト済み]
私はその答えを受け入れ、感謝します。その間、私はこのpythonスクリプトを取得しました。これは、探していたものにいくらか近く機能しました。ソースを見つけようとしましたが、検索した数百のタブで見つかりませんでした。
#!/usr/bin/env python
# Syntax: duplicates.py DIRECTORY
import os, sys
top = sys.argv[1]
d = {}
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
fn = os.path.join(root, name)
basename, extension = os.path.splitext(name)
basename = basename.lower() # ignore case
if basename in d:
print(d[basename])
print(fn)
else:
d[basename] = fn
このファイルをduplicate.pyとして保存し、権限を付与してから、フォルダーで実行します。
./duplicates.py Images
カウントを取得するにはuniq -c
を使用し、最後に逆ソートして重複を最初にリストする必要があります。最後に、awk
は、2以上で始まる行をフィルタリングするために使用されます。
$ find . -type f -exec sh -c 'basename ${0%.*}' {} \; | sort | uniq -c | sort -r | awk 'int($1)>=2'
2 foo
ここで、%.*
は拡張子を削除するため、foo.x.y
はfoo.x
になります。
すべてのファイルを検索する単純なfind . -type f
の代わりに、2番目のコマンドのように*.jpg
または*.png
ファイルをフィルタリングすることもできます。