awk '/^\/dev\// { print $1 }' test1.txt
Предполагая, что это коррелирует с вашим выводом fdisk
...
Вы должны достичь этого, используя цикл for .
Если я правильно понимаю, вы хотите получить список файлов в подкаталоге. Так что сделайте что-нибудь вроде этого:
$ cd dir
$ for files in subdir/*;do echo $files|cut -d '/' -f 2 >>filelist.csv;done
Теперь вы можете видеть, что в вашем каталоге dir был создан файл с именем «filelist.csv».
В качестве более простой альтернативы вы можете перейти в подкаталог и использовать
printf "%s\n" * >../list.csv
Это даст вам список, разделенный новой строкой и завершающийся новой строкой, без запятых. Вы можете увидеть его как дегенерированный CSV-файл только с одним столбцом.
Если вы хотите включить скрытые файлы (файлы с именами, начинающимися с точки ), вы можете использовать *.*
вместо единственного *
. Если вы хотите исключить. и.. имена каталогов, вместо этого используйте *.[^.]*..?*
. Всего:
printf "%s\n" * >../list.csv # For non-hidden files.
printf "%s\n" *.* >../list.csv # For all files.
printf "%s\n" *.[^.]*..?* >../list.csv # For all files but `.` and `..`.
Но имейте в виду, что имена файлов в Linux могут содержать сами по себе символы новой строки. Фактически единственным уникальным однобайтовым разделителем имен файлов является нулевой байт.
Обновление в связи с этим комментарием:
Предположим, что у вас есть любое количество подкаталогов, чье не -скрытое содержимое вы хотите каталогизировать в отдельных файлах в общем родительском каталоге. (Сбор всех имен в один файл намного короче, см. это изящное решение . И, честно говоря, я недостаточно внимательно прочитал ваш комментарий. )Это может быть достигнуто в этом родительском каталоге (dir в вашем случае )с помощью
find. -mindepth 1 -maxdepth 1 -type d -exec bash -c 'cd {}; printf "%s\n" * >../$(basename {}).csv' \;
Для этого требуются программы find
, bash
и basename
.
Используя его, вы должны быть особенно осторожны, чтобы каталог не содержал файлов, имена которых конфликтуют с автоматически сгенерированными списками csv.
Вот как это работает:find
считает каждый файл, который находится ровно на один уровень каталога ниже текущего каталога(.
)— вот что делает -mindepth 1 -maxdepth 1
— :Если это каталог (-type d
), он выполняет(-exec
)команда между -exec
и конечным \;
после замены пустых фигурных скобок({}
)именем этого каталога. Если обозначить это имя через <SUBDIR>
, получится
bash -c 'cd <SUBDIR>; printf "%s\n" * >../$(basename <SUBDIR>).csv'
Это запускает bash
в подпроцессе, заставляя его выполнять аргумент опции -c
как сценарий оболочки, а именно
cd <SUBDIR>;
printf "%s\n" * >../$(basename <SUBDIR>).csv
, что почти то же самое, что и выше. Здесь,выражение
$(basename <SUBDIR>)
расширяется до базового имени <SUBDIR>
. Это необходимо, потому что <SUBDIR>
будет перебирать./subdir1,./subdir2 и т. д. в вашем случае. Соответствующие базовые имена: subdir1, subdir2 и т. д.