2

У меня проблема с поиском только уникальных именованных файлов по каталогам и подкаталогам. Файлы должны быть уникальными по имени, а не по сумме md5 или содержанию.

Мне удалось получить список уникальных файлов, но только имена, а не их местоположение (имя каталога) с этим кодом. Невозможно правильно отсортировать или использовать uniq если имя dir находится в строке ...

find . -type f -name "*" | xargs -I% basename % | sort -u

Пример результата, который я получил:

same_name
some_file
test_file

Ожидаемый результат:

./dir1/same_name
./dir1/some_file
./dir3/test_file

Это было бы примером дерева каталогов, но оно может быть намного больше и глубже

.
├── dir1
│   ├── same_name
│   └── some_file
├── dir2
│   └── same_name
├── dir3
│   └── test_file
└── same_name

1 ответ1

4

Что-то вроде

find . -type f -printf "%f:%p\n" | awk -F: '!seen[$1]++ {print $2}'

Пусть find распечатает базовое имя для вас, а затем с помощью awk распечатает путь только при первом просмотре базового имени.

Я использовал двоеточие в качестве разделителя полей и символ новой строки в качестве (по умолчанию) разделителя записей. Оба являются допустимыми символами имени файла. Этот использует нулевой символ в качестве разделителя записей (недопустимо для имен файлов) и является более надежным

find . -type f -printf "%f\0%p\0" |
  awk -v RS='\0' '{basename=$0; getline} !seen[basename]++'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .