Скопировать все имена файлов во всех каталогах текущей директории в один файл
Обучаюсь программировать в терминале 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 позволяет искать только файлы, директории не будут мешать)
Вот так:
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]=""

