Сортировка файлов по расширению и перемещение их в каталоги

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

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и конечным \;после замены пустых фигурных скобок({})именем этого каталога. Если обозначить это имя через , получится

bash -c 'cd ; printf "%s\n" * >../$(basename ).csv'

Это запускает bashв подпроцессе, заставляя его выполнять аргумент опции -cкак сценарий оболочки, а именно

cd ;
printf "%s\n" * >../$(basename ).csv

, что почти то же самое, что и выше. Здесь,выражение

$(basename )

расширяется до базового имени . Это необходимо, потому что будет перебирать./subdir1,./subdir2 и т. д. в вашем случае. Соответствующие базовые имена: subdir1, subdir2 и т. д.

0
17.02.2021, 16:11
0 ответов

Теги

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