6

Как получить рекурсивный полный список файлов с выводом по одному файлу на строку?

27

Как мне получить плоский список рекурсивных полных путей, по одному на строку?

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

/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 ответ(ов)

7

Если вы хотите выполнить поиск файлов, вы можете использовать команду find, вот как это делается:

Для поиска в текущей директории:

find .

Для поиска в определённой директории (например, в /home/dreftymac):

find /home/dreftymac

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

find . -type f

Или для поиска только файлов в указанной директории:

find /home/dreftymac -type f

Таким образом, команда find позволяет гибко настраивать параметры поиска в зависимости от ваших нужд.

4

Если вы действительно хотите использовать 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, показывающий полные пути к файлам.

0

Да, действительно, существует длинный список ответов. Это очень помогло, и в итоге я создал свои команды, которые искал:

Чтобы вывести список всех файлов в каталоге и его подкаталогах:

find "$PWD" -type f

Чтобы вывести список всех директорий в каталоге и его подкаталогах:

find "$PWD" -type d

Чтобы вывести список всех директорий и файлов в каталоге и его подкаталогах:

find "$PWD"
0

Команда ls -ld $(find .) используется для отображения подробной информации о каталоге и его содержимом в текущем каталоге и подкаталогах, где find . находит все файлы и директории, а ls -ld показывает информацию о каждом объекте.

Если вы хотите отсортировать вывод по времени модификации, используйте команду:

ls -ltd $(find .)

Здесь флаг -t в ls сортирует вывод по времени последней модификации, начиная с самых новых файлов. Не забудьте, что в зависимости от количества файлов использование такой команды может привести к ошибке "Argument list too long" (слишком длинный список аргументов), если найдено слишком много файлов. В этом случае лучше использовать find в комбинации с ls как:

find . -exec ls -ld {} + | sort -k6,7

Эта команда позволит избежать проблемы с длинными аргументами и всё равно отсортировать файлы по времени модификации.

0

Лучшей командой будет: 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

Таким образом, вы сможете фильтровать файлы по их типу!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь