для имени в `ls` и имен файлов с пробелами - PullRequest
21 голосов
/ 27 декабря 2011

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

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

Ответы [ 3 ]

29 голосов
/ 27 декабря 2011

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

16 голосов
/ 27 декабря 2011

Заменить

for name in `ls`

на:

ls | while read name

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

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

3 голосов
/ 27 декабря 2011

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

Во-первых, переменная 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. Может быть, это то, что вы хотите.

...