OSX 命令列尋找具有不同副檔名的重複檔名

OSX 命令列尋找具有不同副檔名的重複檔名

我已經解決了所有類似的問題+安裝了一些命令行實用程序,例如 duff,但沒有成功。

在我的圖像目錄中,我有具有相同名稱但具有不同擴展名的圖像(jpg 和 png)。我只想列印具有不同擴展名的重複文件名的文件名。 (例如 foo.jpg 和 foo.png)或至少一個檔名 (foo)

到目前為止我嘗試過這些方法

find . -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq

find . -type f \( -name "*.jpg" -o -name "*.png" \)

大多數這些命令都會回傳給我沒有什麼或者所有文件或者獨特的檔案名,但不是重複的

答案1

我建議修改你的第二個命令:

find . -type f -name "*.jpg" | \
    while read -r f; do [ -e "${f%.jpg}.png" ] && echo "${f%.jpg}"; done

這將查找所有.jpg檔案並檢查相應的.png檔案是否存在,並顯示不含副檔名的完整路徑。

請注意,如果文件少得多,.png則搜尋這些文件並檢查相應的.jpg文件會更有效。

[在 Ubuntu 18.04.1 上測試bash

答案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過濾*.jpg或文件,而不是使用簡單的來查找所有文件。*.png

相關內容