я знаю
ls -d */
перечисляет все папки в текущем каталоге как dir1/ dir2/ dir3/
.
Есть ли возможность в bash-скрипте показывать папки как dir1 dir2 dir3
?
Чтобы получить только каталоги, но не добавляйте слеш:
ls -d */ | sed 's#/##'
Или вам придется использовать что-то вроде find . -type d -maxdepth 1
(но это вводит ./
префикс)
С помощью find
(это также избавит от ./
или /path/to/
, которые обычно добавляются при использовании find
):
find . -maxdepth 1 -type d -printf '%f\n'
Приведенная выше команда будет включать .
а также точечные файлы (которые обычно скрыты). Чтобы избежать всех каталогов, начинающихся с точки (по крайней мере, с GNU find):
find . -maxdepth 1 -type d ! -name '.*' -printf '%f\n'
Если вы хотите увидеть скрытые каталоги, но не хотите .
, вы можете использовать (опять же, только проверено на GNU find, YMMV с другими версиями find):
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
Чистая bash
:
for f in */; do echo "${f%/}"; done
Следующее немного обманывает, так как фактически заменяет /
пробелом (так что это не очень полезно в скриптах, но если все, что вам нужно, это немного более симпатичный вывод, вам может понравиться):
printf '%s\b \n' */
В качестве альтернативы вы можете использовать zsh
вместо bash
и воспользоваться его квалификаторами glob:
ls -d *(/)
Ты можешь использовать
ls -d */ | awk -F/ '{print$1}'
он направляет вывод ls в awk и говорит ему считать / разделителем поля и выводить только первое поле
Парсинг вывода ls
действительно плохая идея, потому что формат вывода ls
не гарантирован.
Вот решение, которое не требует ls и, следовательно, не зависит от форматирования вывода ls
:
echo */ | sed s#/##g
К сожалению, приведенный выше код не будет корректно работать с именами каталогов, содержащих пробелы. По этой причине лучше разделять элементы списка символами новой строки или символами NULL. Нелегко разделять аргументы чем-то другим, кроме пробела, не повторяя их в цикле оболочки.
Решение, использующее /
чтобы определить, где должна быть размещена новая строка:
echo -n */ | sed 's#/ \?#\n#g'
Решение, которое использует измененный разделитель параметров расширения:
nsplit() { IFS=$'\n' ; echo "$*" | sed 's#/$##' ; } ; nsplit */