1

Как удалить начальные пробелы из имен файлов и папок? (Я использую OS X 10.6 Snow Leopard.)

Как предоставлено ниже @Lri, я смог удалить конечные пробелы, используя это:

#!/bin/bash

IFS=$'\n'
for d in {1..9}; do
    find ~/Desktop -name '* ' -depth $d | while read f; do
        mv "$f" "$(sed 's/ *$//' <<< "$f")"
    done
done

Теперь я пытаюсь удалить ведущие пробелы с помощью этого:

#!/bin/bash

IFS=$'\n'
for d in {1..9}; do
    find ~/Desktop -name '* ' -depth $d | while read f; do
        mv "$f" "$(sed 's/^ *//;s/ *$//' <<< "$f")"
    done
done

но это не работает

Что я делаю неправильно?

1 ответ1

3

Я вижу две проблемы: во-первых, вам нужна команда find для поиска имен с пробелами в начале, а не в конце (-name ' *' вместо -name '* '). Во-вторых, f будет полным путем к файлу, а не только его именем; это означает, что пробелы находятся не в начале строки, а сразу после последней косой черты (например, «/Users/timoto/Desktop/ spacedfile»). Это немного сложнее в обращении; Самым простым способом, который я придумал, было разделение пути с использованием dirname и basename и удаление начальных пробелов только из базовой части.

Кроме того, не нужно запускать команду 9 раз на разных глубинах; просто используйте параметр -depth (без номера), и он будет возвращать результаты в порядке глубины (то есть, самые глубокие файлы перед их содержащими каталогами), что должно предотвратить проблемы с переименованием каталогов из-за недостаточной обработки файлов в них.

IFS=$'\n'
find ~/Desktop -name ' *' -depth | while read f; do
    mv "$f" "$(dirname "$f")/$(basename "$f" | sed 's/^ *//;s/ *$//')"
done

РЕДАКТИРОВАТЬ: моя команда basename/sed была более запутанной, чем это должно быть; упростил это ...

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