
同様の質問をすべて調べ、duff などのコマンドライン ユーティリティをいくつかインストールしましたが、成功しませんでした。
画像ディレクトリに、同じ名前だが拡張子が異なる画像 (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" \)
これらのコマンドのほとんどは、何もないまたはすべてのファイルまたは個性的ファイル名は含まれないが、重複するもの。
答え1
2 番目のコマンドを変更することをお勧めします。
find . -type f -name "*.jpg" | \
while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done
これにより、すべての.jpg
ファイルが検索され、対応する.png
ファイルが存在するかどうかが確認され、拡張子なしの完全なパスが表示されます。
ファイルの数が非常に少ない場合は、.png
それらを検索して対応するファイルを確認する方が効率的であることに注意してください.jpg
。
[ bash
Ubuntu 18.04.1 でテスト済み。]
答え2
回答を受け入れ、感謝します。その間、私が探していたものにかなり近い動作をするこの Python スクリプトを入手しました。ソースを見つけようとしましたが、検索した 100 個のタブで見つけることができませんでした。
#!/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
このファイルを duplicates.py として保存し、権限を付与してからフォルダー上で実行します。
./duplicates.py Images
答え3
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