我運行的是 OS X 10.7.3。我想找到文件名中具有公共字串的所有文件。
我有一個資料夾,其中包含多個文件,其文件名稱除前綴外均相同。例如:
003 - 日食.mp3
008 - 美麗的一天.mp3
027 - 日食.mp3
103 - 起伏的丘陵.mp3
244 - 連綿起伏的丘陵.mp3
我想從該列表中過濾掉任何具有“完全唯一”名稱的實體,在本例中:008 - Beautiful Day.mp3
是否有 GUI 用戶端、自動化腳本或終端命令可以執行此操作?
多謝!
答案1
ls | cut -b 6- | sort | uniq -c | sort -r
這會刪除前綴並顯示檔案被「重複」的次數
答案2
這將列印不帶前綴的文件名列表:
awk -F ' - ' '{counts[$2]++; names[$0]} END {for (item in counts) {if (counts[item] > 1) {print item}}}' < <(printf '%s\n' *)
輸出範例:
Solar Eclipse.mp3
Rolling Hills.mp3
要列印每個文件的完整文件名:
awk -F ' - ' '{counts[$2]++; names[$0]} END {for (name in names) {split(name, parts, / - /); if (counts[parts[2]] > 1) {print name}}}' < <(printf '%s\n' *)
輸出範例:
027 - Solar Eclipse.mp3
003 - Solar Eclipse.mp3
244 - Rolling Hills.mp3
103 - Rolling Hills.mp3
不保證輸出中文件的順序被分組(即使在這個簡單的範例中也是如此)gawk
。
awk -F ' - ' '
{
counts[$2]++;
names[++c] = $2 " - " $1
}
END {
num = asort(names);
for (i = 1; i <= num; i++) {
split(names[i], indices, / - /)
if (counts[indices[1]] > 1) {
print indices[2] " - " indices[1]
}
}
}
' < <(printf '%s\n' *)
如果你沒有gawk
,你可以使用sort
:
awk ... | sort -k3,3
printf
您可以將其透過管道傳輸到 AWK 腳本中,而不是使用進程替換。或者,如果您想遞歸地執行此操作,則可以find
在管道中使用或使用進程替換。如果您希望遞歸運行來全域比較檔名,則需要刪除find
預設輸出的目錄名稱。