Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » [решено] имена файлов с пробелами

Ответить
Настройки темы
[решено] имена файлов с пробелами

Аватара для IZOprogman

Пользователь


Сообщения: 84
Благодарности: 1

Профиль | Отправить PM | Цитировать


Написал скрипт на bash для простой задачи: в цикле по маске перебираются файлы из данной директории, нечто выполняется с ними, а потом текущий файл переименовывается; допустим, f.txt в ~f.old.
Переименование делаю вызовом команды:
Код: Выделить весь код
mv $filename.txt ~$filename.old
Это проходит, если в имени файла нет пробелов; если они есть, то команда начинает воспринимать последний "токен" как конечную директорию.
С консоли можно эту операцию закавычить:
Код: Выделить весь код
>$ mv "x y.txt" "~x y.old"
- и это проходит. Но в скрипте из-за пробелов в исходном имени она воспринимает опять же новое имя как директорию. А если закавычить первый аргумент, она... воспринимает кавычки как часть имени и не находит такой файл!

Как правильно написать?

Отправлено: 02:28, 24-12-2015

 
mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3898
Благодарности: 160

Профиль | Отправить PM | Цитировать


IZOprogman,
а если так:
Код: Выделить весь код
ls -l Рабочий\ стол
т.е. в Вашем случае:
Код: Выделить весь код
mv "x\ y.txt" "~x y.old"

Отправлено: 16:16, 24-12-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


ИО Капитана Очевидности


Contributor


Сообщения: 5295
Благодарности: 1094

Профиль | Отправить PM | Цитировать


IZOprogman, думаю, что правильно писать так
Код: Выделить весь код
mv ""\$oldfile\"" ""\$newfile\""
Если вы в тексте скрипта просто напишете двойные кавычки, тогда BASH воспримет это как строковое значение с вложенной переменной, и при выполнении скрипта он преобразует переменную в имя файла без кавычек, и у вас будут проблемы с пробелами

Если же вы в тексте скрипта экранируете кавычки, тогда при выполнении скрипта BASH преобразует \" в нормальные кавычки и в результате преобразует переменную в имя файла, обозначенное кавычками, что устранит все возможные проблемы с пробелами.

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:55, 25-12-2015 | #3


Аватара для IZOprogman

Пользователь


Сообщения: 84
Благодарности: 1

Профиль | Отправить PM | Цитировать


Ох, а ларчик-то открывался просто!
Оказывается аргументы комангды надо было просто... закавычить!
Код: Выделить весь код
mv "$filename.txt" "~$filename.old"
Всем спасибо.

Отправлено: 00:00, 31-12-2015 | #4


Аватара для kim-aa

Назгул


Moderator


Сообщения: 2624
Благодарности: 342

Профиль | Отправить PM | Цитировать


Нейл Мэтью Ричард Стоунс
Основы программирования в Linux

стр. 48

Заключение в кавычки
Прежде чем двигаться дальше, вам следует уяснить одно правило командной оболочки: использование кавычек.
Обычно параметры в сценариях отделяются неотображаемыми символами или знаками форматирования (например, пробелом, знаком табуляции или символом перехода на новую строку).
Если вы хотите, чтобы параметр содержал один или несколько неотображаемых символов, его следует заключить в кавычки.
Поведение переменных, таких как $foo, заключенных в кавычки, зависит от вида используемых кавычек. Если вы заключаете в двойные кавычки $-представление переменной, оно во время выполнения командной строки заменяется значением
переменной.
Если вы заключаете его в одинарные кавычки или апострофы, никакой замены не происходит. Вы также можете отменить специальное назначение символа $, вставив перед ним символ \ (обратный слэш).
Выполним упражнение 2.1.

Упражнение 2.1. Игра с переменными
В этом упражнении показано, как кавычки влияют на вывод переменной:
#!/bin/sh
myvar="Hi there"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar

echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0

-------
Мы овладеваем более высоким стилем спора. Спор без фактов. Спор на темпераменте. Спор, переходящий от голословного утверждения на личность партнера. (c)Жванецкий

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:29, 20-02-2016 | #5



Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » [решено] имена файлов с пробелами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] MKVMerge и мульон файлов: склеить дорожки из разных папок с пробелами R.i.m.s.k.y. Скриптовые языки администрирования Windows 2 15-06-2013 11:33
CMD/BAT - [решено] Системные имена файлов Cypp0raT Скриптовые языки администрирования Windows 3 24-11-2012 18:46
CMD/BAT - [решено] кириллические имена файлов и маска ~*.* ffs2001 Скриптовые языки администрирования Windows 18 04-04-2012 02:05
Интерфейс - Имена файлов в папке Windows\Media Билл Гейтс Microsoft Windows 2000/XP 3 09-11-2008 13:10
Удаление файлов с пробелами в имени в cmd o3opHuk Хочу все знать 5 28-02-2006 15:53




 
Переход