1

я знаю

ls -d */

перечисляет все папки в текущем каталоге как dir1/ dir2/ dir3/ .

Есть ли возможность в bash-скрипте показывать папки как dir1 dir2 dir3?

4 ответа4

4

Чтобы получить только каталоги, но не добавляйте слеш:

ls -d */ | sed 's#/##'

Или вам придется использовать что-то вроде find . -type d -maxdepth 1 (но это вводит ./ префикс)

4

С помощью 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 *(/)
1

Ты можешь использовать

ls -d */ | awk -F/ '{print$1}'

он направляет вывод ls в awk и говорит ему считать / разделителем поля и выводить только первое поле

1

Парсинг вывода ls действительно плохая идея, потому что формат вывода ls не гарантирован.

Вот решение, которое не требует ls и, следовательно, не зависит от форматирования вывода ls :

echo */ | sed s#/##g

К сожалению, приведенный выше код не будет корректно работать с именами каталогов, содержащих пробелы. По этой причине лучше разделять элементы списка символами новой строки или символами NULL. Нелегко разделять аргументы чем-то другим, кроме пробела, не повторяя их в цикле оболочки.

Решение, использующее / чтобы определить, где должна быть размещена новая строка:

echo -n */ | sed 's#/ \?#\n#g'

Решение, которое использует измененный разделитель параметров расширения:

nsplit() { IFS=$'\n' ; echo "$*" | sed 's#/$##' ; } ; nsplit */

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .