Ответ 1
Просто не используйте подстановку команд: используйте for name in *
.
Следующий код не работает из-за пробелов в именах файлов, как исправить?
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
Просто не используйте подстановку команд: используйте for name in *
.
Заменить
for name in `ls`
с:
ls | while read name
Уведомление: bash переменная область видимости ужасная. Если вы измените переменную внутри цикла, она не вступит в силу вне цикла (в моей версии она не будет, в вашей версии она будет). В этом примере это не имеет значения.
Примечание 2. Это работает с именами файлов с пробелами, но не выполняется для некоторых других странных, но допустимых имен файлов. См. Комментарий Чарльза Даффи ниже.
Похоже на две потенциальные проблемы:
Во-первых, переменная 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
. Может быть, это то, что вы хотите.