Скопировать все имена файлов во всех каталогах текущей директории в один файл

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

введите сюда описание изображения

Мне необходимо найти самый повторяемый файл по названию. Я решил реализовать поиск сначала через занесение все имен файлов всех каталогов в один файл, а там уже через grep, sort и uniq решать дальше. Но на моменте записи названий файлов в один файл, ls команда передает только файлы из текущей директории вместо файлов из внутренних каталогов выводит только их имена:

введите сюда описание изображения

Как мне это исправить?


Ответы (2 шт):

Автор решения: Аркадий

Посмотрите в сторону find . -type f

$ tree
.
├── duble1
│   ├── text
│   ├── text1
│   ├── text2
│   └── text3
├── duble2
│   ├── text
│   └── text1
└── duble3
    └── text
$ find . -type f
./duble3/text
./duble1/text
./duble1/text3
./duble1/text1
./duble1/text2
./duble2/text
./duble2/text1

(-type f позволяет искать только файлы, директории не будут мешать)

→ Ссылка
Автор решения: Zombotron

Вот так:

declare -A newmap
while IFS= read -r line; do
    newmap[$line]=""
done < <( find -type f -printf '%f\n' | sort -t';' -k1,1 )

for i in ${newmap[@]}; do
  echo $i >> file.txt
done

Тут сразу при добавлении идет своего рода проверка на уникальность. Два элемента с одинаковыми ключами у newmap не будет.

Не забывайте, что линукс регистрозависим, и file.txt и File.txt - разные файлы. Если это критично, отформатируйте имя файла, как вам нужно в строке newmap[$line]=""

→ Ссылка