распечатывание всех каталогов и подкаталогов функция

Команда vi % s / \ ([az] \ ), \ ([AZ] \) / \ 1 \ 2 / g изменит

y,S
T,d
5,e

на

y S
T,d
5,e
0
09.08.2018, 18:25
3 ответа

В оболочках, совместимых с SH, существует так называемая переменная IFS. IFS расшифровывается как Внутренний разделитель полей . Эта переменная управляет тем, как оболочка определяет границы параметров, например, в позиционных аргументах.

По умолчанию:

set IFS=$' \t\n'

Что переводится как :разделить ввод на токены, разделенные пробелом, табуляцией и новой строкой.

Ваши файлы состоят из пробелов. Попробуйте сделать это так:

OLD_IF="$IFS"
IFS=$'\t\n'
for file in `ls -1` ; do
     # Content of your loop
done
IFS="$OLD_IFS"

Здесь загвоздка в том, чтобы сохранить предыдущее значение IFS и восстановить его.

Редактировать :добавлено ls -1, так как в этом списке по одному файлу в строке, следовательно, выполняется то, что вы упомянули.

2
28.01.2020, 02:23

В баш:

shopt -s globstar
ls -1d **/
1
28.01.2020, 02:23

Ваша функция анализирует вывод lsбез кавычек. Это означает, что оболочка будет выполнять разбиение слов (по умолчанию для любых пробелов )и генерацию имени файла (подстановку )на выходе ls.

Вместо:

dirwalk () {
    indent=${1:-0}

    for name in *; do
        [ ! -e "$name" ] && continue
        if [ -d "$name" ]; then
            printf '%*sDir: "%s"\n' "$indent" "" "$name"
            ( cd "$name" && dirwalk "$(( indent + 4 ))" )
        else
            printf '%*sFile: "%s"\n' "$indent" "" "$name"
        fi
    done
}

или, без причудливого отступа,

dirwalk () {
    for name in *; do
        [ ! -e "$name" ] && continue
        if [ -d "$name" ]; then
            printf 'Dir: "%s"\n' "$name"
            ( cd "$name" && dirwalk )
        else
            printf 'File: "%s"\n' "$name"
        fi
    done
}

Используя *вместо вывода ls, мы создаем правильно разделенный список имен файлов для повторения в текущем каталоге, даже если они содержат пробелы.

Тест -eдолжен убедиться, что то, что мы повторяем, действительно существует. Если мы войдем в пустой каталог, *не будет расширяться и останется как *. В bashвы можете установить параметр оболочки nullglob(с помощью shopt -s nullglob), чтобы вместо этого непревзойденные шаблоны расширялись до нуля.

При использовании cdв подоболочке (в круглых скобках )нам не нужно помнить cd.., чтобы вернуться в предыдущий каталог. Окружающая среда за пределами (... )не будет затронута cdвнутри него.

Используя printfвместо echo, мы лучше контролируем форматирование вывода. Также см. «Почему printf лучше, чем echo? ».

0
28.01.2020, 02:23

Теги

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