Следующий код не работает из-за пробелов в именах файлов, как исправить?
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
Ответ 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. Может быть, это то, что вы хотите.