Используйте 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 
  • Почему mkdir -p / Local / Foo / Bar / Wah не работает, но cd / local и mkdir -p Foo / Bar / Wah работает?
  • Ошибка включенного зонда: syscall :: open_nocancel: entry): недопустимый доступ пользователя в действии №2 в DIF
  • Невозможно выполнить двоичный файл в Mac OS X Lion 10.7.5
  • Безопасно ли менять владельца системных папок OS X?
  • Sed целое слово с заменой отдельных букв, с BSD sed?
  • / Библиотека: операция не разрешена при входе в систему как пользователь root
  • Список всех флагов файла?
  • Установка PHP на OS X. Синтаксические ошибки?
  • Отображение «PRI» и «NI» через «top -stats»
  • Как проверить, установлен ли mysql с помощью сценария bash?
  • MacOS X Mavericks, работающий с VirtualBox, не может взаимодействовать с Linux VM
  • Linux и Unix - лучшая ОС в мире.