web-dev-qa-db-ja.com

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

私はすべての同様の質問を通過しました+ 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 一意ファイル名ですが重複したものではありません。

1
Naveed Abbas

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でテスト済み]

5
AFH

私はその答えを受け入れ、感謝します。その間、私はこの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
1
Naveed Abbas

カウントを取得するには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.yfoo.xになります。

すべてのファイルを検索する単純なfind . -type fの代わりに、2番目のコマンドのように*.jpgまたは*.pngファイルをフィルタリングすることもできます。

0
slhck