Получить все пути к файлу из определенной точки и передать в текстовый файл

Если мой терминал в настоящий момент находится в home/stuff/stuff2, а в папке stuff2 есть больше папок и файлов, как я могу запустить команду, чтобы получить имена файлов всех файлов и папок из этого каталога и далее (включая все суб-файлы каталоги).

Операция должна выполнять следующее:

Путь к файлу должен начинаться с местоположения команды терминала, поэтому мне не нужны полные пути к файлам. Например, вместо чтения home/stuff/stuff2/stuff3/cat.png я предпочел бы, чтобы чтение было stuff3/cat.png Оно должно захватывать каждый файл, папку и файлы в этих папках. Он должен быть передан (я думаю, что это термин) в текстовый файл.

Любые идеи?

1
задан 15 November 2014 в 05:49

2 ответа

В дополнение к find, это также возможно сделать только с помощью оболочки bash:

shopt -s globstar
printf "%s\n" ** >file

Все имена выходных файлов печатаются относительно текущего каталога. [!d1 ]

shopt -s globstar позволяет globstar, что дает bash некоторую степень find. С помощью globstar две звезды подряд будут, как указано в man bash, «сопоставлять все файлы и нулевые или более каталоги и подкаталоги». Здесь printf используется для форматирования имен файлов по одной строке. Вывод отправляется в текстовый файл с именем file.

Имена файлов со специальными символами

Этот вопрос запрашивает вывод в текстовом файле. Текстовые файлы обычно имеют строки, разделенные символами новой строки. Если любое имя файла или каталога содержит символ новой строки, это приведет к путанице. Если не известно, что такого файла нет, лучше использовать файл с нулевым разделом, а не текстовый файл, разделенный символом новой строки.

В этом случае можно использовать:

printf "%s\000" ** >file

Или

find -print0 >file

Поскольку символ nul (ascii 000) никогда не разрешен в имени файла, это тот формат, который может использоваться для хранения имен файлов в файле без опасности теряя информацию.

2
ответ дан 24 May 2018 в 01:51
  • 1
    Если вы хотите включить имена, начинающиеся с точки (.), вы также должны shopt -s dotglob. – G-Man 18 November 2014 в 02:27

Если вы можете обрабатывать файл в форме «./dir/filename», тогда будет работать простая форма команды find: find . -type f > filename будет передавать все файлы под текущим каталогом в «filename».

После просмотра ответа @ steeldriver комбинация его решения и моей проблемы устранит префикс «./», например:

Если вам не нужны пустые имена каталогов в списке (т. е. просто имена файлов в каждом каталоге, find -type f -printf "%P\n" > file

Если вы на самом деле не хотите сами имена каталогов вместе с каталогом / именами файлов, то опустите флаг «-type f» из всех примеров.

1
ответ дан 24 May 2018 в 01:51
  • 1
    OP хочет как имена каталогов, так и файлы. поэтому удалите -type f – αғsнιη 15 November 2014 в 11:37
  • 2
    @KasiyA: Мы этого не знаем. Я обнаружил, что для очень большого процента вопросов новичков они не сформулированы так, что вы можете воспринимать их буквально, слово в слово. Ваша интерпретация отличается от моей, но до тех пор, пока я не услышу по-другому, я не буду предполагать, что то, что он на самом деле хотел. – Marty Fried 15 November 2014 в 20:07
  • 3
    Да все верно. Он сказал « имена файлов из всех файлов и папок из этого каталога». это предложение его неясно. но я думаю, что он хочет, чтобы все файлы и папки назывались в соответствии с его принятым ответом . – αғsнιη 15 November 2014 в 20:41

Другие вопросы по тегам:

Похожие вопросы: