Я использую Mac OSX и пытаюсь использовать командную строку, чтобы найти количество файлов с таким же именем.
Я попытался использовать следующую команду:
find ~ -type f -name "*" -print | basename | sort | uniq -d > duplicate_files
Это не работает! Когда я делаю следующее:
find ~ -type f -name "*" -print > duplicate_files
Тогда duplicate_files содержит пути ко всем моим файлам. Поэтому я думаю, что проблема в том, basename
что он не принимает стандартный ввод. Затем я попробовал следующее:
basename $(find ~ -type f -name "*" -print) > duplicate_files
но опять же это не похоже на работу. Поиск в интернете, кажется, не приносит особой радости. Любые мысли приветствуются.
Почему бы не использовать встроенные
find
функции для вывода только имени файла:(предполагает GNU
find
) или хотя бы что-то вроде этого:basename
не может читать по каналу или обрабатывать несколько файлов одновременно.пс. Нет необходимости указывать
-name '*'
, хотите ли вы перечислить все файлы. Это опция по умолчанию.источник
basename: unknown primary or operator
. Спасибо за подсказку на-name "*"
-printf
даже на странице руководства posix. Насчет ошибки со вторым способом, это причина опечатки в моем ответе. Исправлена. Не могли бы вы попробовать это еще раз?-printf
я получаю-printf: unknown primary or operator
. Кроме того, когда я проверял Unix в справочнике Nutshell, он указывался как опция GNU / Linux - ничего не говорится об OSXman find
в вашей консоли :)Кажется, это работает для меня на OSX:
источник
+
означает в команде?-a
опцию для покрытия этого случая.Альтернативы (предполагается, что в именах файлов нет новой строки):
источник
Вы можете использовать
xargs
с,basename
чтобы получить желаемый результат, например так:источник
В последней версии,
bash
которая обрабатывает ассоциативные массивы, следующее дополнительно будет обрабатывать имена путей со встроенными символами новой строки:Это не использует внешнюю утилиту.
источник