Используйте 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 
  • Как лучше настроить тройную загрузку с MacOS Sierra, Windows 10 и Linux Mint в 2016 году iMac?
  • Смутно о том, как преобразовать XML в CSV с помощью xmlstarlet в OS X?
  • Что такое PATH на Mac OS?
  • Как измерить изменения в файловой системе, выполненные определенным приложением?
  • Как может команда монтирования сбой в одном окне терминала, но не в другом?
  • newsyslog для путей с пустыми пространствами
  • find -delete не удаляет непустые каталоги
  • Установщик считает, что на OS X выполняется установка
  • Простая замена вкладок табов таинственным образом
  • Перемещение тысяч файлов jpg в ежедневные каталоги на основе файлов даты создания EXIF
  • Могу ли я восстановить том HFS +, если файлы были нечитаемы после восстановления «Восстановление Easus Recovery»? Информация о Testdisk & Diskutil ниже
  • Interesting Posts

    Отдельные ярлыки Chromeapp Chrome от Chrome в Gnome Shell

    Iptables: сопоставление исходящего трафика с conntrack и владельцем. Работает со странными каплями

    скользящее окно JPG из тысяч файлов

    Jailbreaking HDTV

    Почему хеш-символ Gedit расширен и интерпретируется неправильно в интернет-браузерах?

    Как получить 0-заполненные числа в {} (расширение брекета)?

    что не так с моим простым сценарием меню выбора?

    Что такое distro-agnostic способ определить дату установки ОС?

    virtualbox-5.0: Зависит от libvpx2 (> = 1.4.0), но он не устанавливается

    Проверьте, установлен ли CVE-2016-10229 на моем Linux-сервере XEN Debian

    dnsmasq – наводнение daemon.log с сообщениями

    zpool import – невозможно импортировать: одно или несколько устройств в настоящее время недоступны

    mount: непризнанный тип сегмента тонкий

    Файловый менеджер общих диалогов, таких как Open или Save

    оценка команд двойной блокировки в выражении состояния bash

    Linux и Unix - лучшая ОС в мире.