Используйте basename для анализа списка путей, хранящихся в файле

Я запускаю Mac OSX и пытаюсь использовать командную строку для поиска количества файлов, которые у меня есть с тем же именем.

Я попытался использовать следующую команду:

find ~ -type f -name "*" -print | basename | sort | uniq -d > duplicate_files 

Это не работает! Когда я делаю следующее:

 find ~ -type f -name "*" -print > duplicate_files 

Затем duplicate_files содержит пути всех моих файлов. Поэтому я думаю, что проблема basename с basename – она ​​не принимает стандартный ввод. Затем я попробовал следующее:

 basename $(find ~ -type f -name "*" -print) > duplicate_files 

но опять же это не работает. Поиск в Интернете, похоже, не приносит большой радости. Любые мысли приветствуются.

basename работает по аргументу командной строки, он не читается со стандартного ввода.

Вам не нужно вызывать basename утилиту, и вам лучше не делать этого: все, что нужно сделать, – это отключить часть до последнего / , и было бы медленно вызывать внешнюю команду для каждой записи, вы можете использовать вместо этого используется текстовая утилита.

 find ~ -type f | sed 's!.*/!!' | sort | uniq -d 

Возможно, более полезно отслеживать расположение файлов. Сортировка по имени упрощает поиск дубликатов, но sort не имеет возможности использовать последнее поле. Что вы можете сделать, это скопировать последнее / -сепаратированное поле в начало, затем отсортировать, а затем использовать бит ad hoc-обработки awk для извлечения и представления дубликатов.

 find ~ -type f | sed 's!.*/\(.*\)!\1/&!' | # copy the last field to the beginning sort -t/ -k1,1 | cut -d/ -f2- | # remove the extra first field (could be combined with awk below) awk -F / '{ if ($NF == name) { if (previous != "") {print previous; previous = ""} print } else { previous = $0 name = $NF } ' 

(Обратите внимание, что я предполагаю, что ни одно из ваших имен файлов не содержит символов новой строки.)

Почему бы не использовать встроенные функции find для вывода только имени файла:

 find ~ -type f -printf '%f\n' | sort | uniq -c 

(предполагает GNU find ) или, по крайней мере, что-то вроде этого:

 find ~ -exec basename {} \; | sort | uniq -c 

basename не может читать через канал или обрабатывать сразу несколько файлов.

пс. Нет необходимости указывать -name '*' если вы хотите перечислить все файлы. Это опция по умолчанию.

Альтернативы (не принимает новую строку в именах файлов):

 find ~ -type f | awk -F/ '{print $NF}' | sort | uniq -d 

Мне кажется, это работает на OSX:

 find ~ -type f -exec basename -a {} + | sort | uniq -d