Используйте 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 

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

4 Solutions collect form web for “Используйте basename для анализа списка путей, хранящихся в файле”

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 
  • Почему du сообщает размер 0 для некоторых непустых файлов на разделе HFS +?
  • Сброс памяти Bash, используемой для автозаполнения
  • Создание постоянного USB с минимальной ОС на os x
  • Почему tr не читается с / dev / urandom на OSX?
  • collectd создает / home папку на моем mac, и я не могу удалить его
  • Какое распределение вы предлагаете для ежедневного использования?
  • Как изменить программу «чтения» по умолчанию?
  • Получить абсолютный путь к файлу OS X
  • Пакетное переименование нескольких файлов с добавленной датой и меткой времени
  • Невозможно выполнить exec / bin / false: нет такого файла или каталога
  • Почему vim возвращает ненулевой код выхода, если я выйду сразу после открытия?
  • Linux и Unix - лучшая ОС в мире.