Я использую for loop
такой как
for j in ls ${folder}/*
получить все подпапки в моем каталоге ($folder
).
Но я хочу только названия подкаталогов и хочу удалить структуру каталогов. Я использую xargs
basenme
при работе с файлами, но это не работает с каталогами.
Можно вложить список всех папок (точно один уровень подкаталогов):
find /path/to/dir -maxdepth 1 -mindepth 1 -type d
Можно передать результат по каналу в sed
команда, которая оставит только имя каталога (без префикса)
find /path/to/dir -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'
Пример:
$ find /var -maxdepth 1 -mindepth 1 -type d
/var/metrics
/var/lib
/var/local
/var/cache
/var/spool
/var/crash
/var/backups
/var/mail
/var/snap
/var/opt
/var/log
/var/tmp
$ find /var -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'
metrics
lib
local
cache
spool
crash
backups
mail
snap
opt
log
tmp
Используя for
цикл:
$ for i in $(find /var -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n'); do echo $i; done
metrics
lib
local
cache
spool
crash
backups
mail
snap
opt
log
tmp
для перестроенного цикла:
$ for i in $(find /var -maxdepth 1 -mindepth 1 -type d -print0 | sed -z 's!.*/!!' |tr '\0' '\n');
do
echo $i
done
$folder/*/
соответствует каждому подкаталогу в $folder
. Используйте bash
Расширение параметров , чтобы вырезать имя каталога:
for j in $folder/*/; do
j=${j%/}
j=${j##*/}
…
done
Это просто переопределяет j
вырезая сначала последний слеш, а затем все до последнего слеша в строке, фактически оставляя только имя подкаталога.
Лучше использовать команду find
вместо цикла for.
find "$folder" -mindepth 1 -maxdepth 1 -type d -execdir printf '%s\n' '{}' +
Здесь мы использовали -execdir
, который изменяет путь к каталогу, где был найден каталог -d
, поэтому {}
будет содержать только последний элемент при печати, который является именем каталога.
Или с GNU find
, который поддерживает опцию -printf
для форматирования.
find "$folder" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
То, что -f
возвращает только последний элемент с удаленными ведущими каталогами.
Примечание : это ограничено списком подкаталогов только в указанном $folder
; Вы можете настроить / удалить -maxlength
в соответствии с вашими требованиями.