Как получить название каталогов, удаляющих путь?

Я использую for loop такой как

for j in ls ${folder}/*

получить все подпапки в моем каталоге ($folder).

Но я хочу только названия подкаталогов и хочу удалить структуру каталогов. Я использую xargs basenme при работе с файлами, но это не работает с каталогами.

0
задан 20 September 2018 в 22:13

3 ответа

Можно вложить список всех папок (точно один уровень подкаталогов):

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
5
ответ дан 27 October 2019 в 10:31

$folder/*/ соответствует каждому подкаталогу в $folder. Используйте bash Расширение параметров , чтобы вырезать имя каталога:

for j in $folder/*/; do
  j=${j%/}
  j=${j##*/}
  …
done

Это просто переопределяет j вырезая сначала последний слеш, а затем все до последнего слеша в строке, фактически оставляя только имя подкаталога.

3
ответ дан 27 October 2019 в 10:31

Лучше использовать команду 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 в соответствии с вашими требованиями.

1
ответ дан 27 October 2019 в 10:31

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

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