OSX コマンドラインで異なる拡張子を持つ重複ファイル名を検索する

OSX コマンドラインで異なる拡張子を持つ重複ファイル名を検索する

同様の質問をすべて調べ、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

[ bashUbuntu 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

関連情報