записывает файлы в подкаталог в csv файл и сохраняет их в родительский каталог в командной строке linux

awk '/^\/dev\// { print $1 }' test1.txt

Предполагая, что это коррелирует с вашим выводом fdisk...

1
17.01.2019, 02:00
2 ответа

Вы должны достичь этого, используя цикл for .

Если я правильно понимаю, вы хотите получить список файлов в подкаталоге. Так что сделайте что-нибудь вроде этого:

$ cd dir
$ for files in subdir/*;do echo $files|cut -d '/' -f 2 >>filelist.csv;done

Теперь вы можете видеть, что в вашем каталоге dir был создан файл с именем «filelist.csv».

1
27.01.2020, 23:23

В качестве более простой альтернативы вы можете перейти в подкаталог и использовать

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 и т. д.

2
27.01.2020, 23:23

Теги

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