Как получить рекурсивный полный список файлов с выводом по одному файлу на строку?
Как мне получить плоский список рекурсивных полных путей, по одному на строку?
Мне нужно получить плоский список файлов с их полными путями. Например, в результате я хочу видеть что-то вроде этого:
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt
Команда ls -a1
почти подходит для моих нужд, но я не хочу видеть фрагменты путей, мне нужны полные пути. Как это можно реализовать?
5 ответ(ов)
Если вы хотите выполнить поиск файлов, вы можете использовать команду find
, вот как это делается:
Для поиска в текущей директории:
find .
Для поиска в определённой директории (например, в /home/dreftymac
):
find /home/dreftymac
Если вам нужны только файлы (без директорий, устройств и т.д.), добавьте параметр -type f
:
find . -type f
Или для поиска только файлов в указанной директории:
find /home/dreftymac -type f
Таким образом, команда find
позволяет гибко настраивать параметры поиска в зависимости от ваших нужд.
Если вы действительно хотите использовать ls
, вы можете отформатировать его вывод с помощью awk
. Вот команда, которая поможет вам получить желаемый результат:
ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
В этом скрипте awk
выполняет следующие действия:
- Когда встречается строка, заканчивающаяся на
:
, и флагf
установлен (т.е. предыдущий каталог уже был обработан), сохраняется имя текущего каталога. - Когда встречается строка, заканчивающаяся на
:
, и флагf
не установлен, имя каталога сохраняется и флагf
устанавливается в 1. - Наконец, если текущая строка не пустая и флаг
f
установлен, выводится полный путь к файлу.
Таким образом, вы получите структурированный вывод из ls
, показывающий полные пути к файлам.
Да, действительно, существует длинный список ответов. Это очень помогло, и в итоге я создал свои команды, которые искал:
Чтобы вывести список всех файлов в каталоге и его подкаталогах:
find "$PWD" -type f
Чтобы вывести список всех директорий в каталоге и его подкаталогах:
find "$PWD" -type d
Чтобы вывести список всех директорий и файлов в каталоге и его подкаталогах:
find "$PWD"
Команда ls -ld $(find .)
используется для отображения подробной информации о каталоге и его содержимом в текущем каталоге и подкаталогах, где find .
находит все файлы и директории, а ls -ld
показывает информацию о каждом объекте.
Если вы хотите отсортировать вывод по времени модификации, используйте команду:
ls -ltd $(find .)
Здесь флаг -t
в ls
сортирует вывод по времени последней модификации, начиная с самых новых файлов. Не забудьте, что в зависимости от количества файлов использование такой команды может привести к ошибке "Argument list too long" (слишком длинный список аргументов), если найдено слишком много файлов. В этом случае лучше использовать find
в комбинации с ls
как:
find . -exec ls -ld {} + | sort -k6,7
Эта команда позволит избежать проблемы с длинными аргументами и всё равно отсортировать файлы по времени модификации.
Лучшей командой будет: tree -fi
-f
печатает полный путь ко всем файлам.-i
отключает отображение отступов.
Например, выполнение команды:
$ tree -fi
.
./README.md
./node_modules
./package.json
./src
./src/datasources
./src/datasources/bookmarks.js
./src/example.json
./src/index.js
./src/resolvers.js
./src/schema.js
Если вам нужно получить только файлы, исключив символ >
, вы можете использовать следующую команду:
tree -fi | grep -v \>
Если вы хотите узнать характеристики каждого файла (например, читать только ASCII-файлы), вы можете воспользоваться циклом while
:
tree -fi |
grep -v \> |
while read -r first ; do
file "${first}"
done |
grep ASCII
Таким образом, вы сможете фильтровать файлы по их типу!
Как установить переменную на вывод команды в Bash?
Как изменить цвет вывода echo в Linux
Как итерировать аргументы в Bash-скрипте
find -exec с несколькими командами
Почему в моем терминале неправильно отображаются юникодные символы?