Подтвердить что ты не робот

Для имени в `ls` и именах файлов с пробелами

Следующий код не работает из-за пробелов в именах файлов, как исправить?

IFS = '\n'
for name in `ls `
do
    number=`echo "$name" | grep -o "[0-9]\{1,2\}"`
    if [[ ! -z "$number" ]]; then
        mv "$name" "./$number"
    fi
done
4b9b3361

Ответ 1

Просто не используйте подстановку команд: используйте for name in *.

Ответ 2

Заменить

for name in `ls`

с:

ls | while read name

Уведомление: bash переменная область видимости ужасная. Если вы измените переменную внутри цикла, она не вступит в силу вне цикла (в моей версии она не будет, в вашей версии она будет). В этом примере это не имеет значения.

Примечание 2. Это работает с именами файлов с пробелами, но не выполняется для некоторых других странных, но допустимых имен файлов. См. Комментарий Чарльза Даффи ниже.

Ответ 3

Похоже на две потенциальные проблемы:

Во-первых, переменная IFS и ее назначение не должны иметь места в них. Вместо

IFS = '\n' он должен быть IFS=$'\n'

Во-вторых, for name in ls вызовет проблемы с именем файла, имеющим spaces и newlines. Если вы просто хотите обработать filename с помощью spaces, тогда сделайте что-то вроде этого

for name in *

Я не понимаю значение строки

number=`echo "$name" | grep -o "[0-9]\{1,2\}"`

Это даст вам номера, найденные в filename with spaces в new lines. Может быть, это то, что вы хотите.