имя файла, содержащее пробелы и командная строка bash

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

Название фильма содержит пробелы. Как запустить его, используя командную строку и mplayer?

есть стойкое ощущение, что ранее у меня все запускалось, используя символ "\" перед каждым пробелом. Перебил систему с 32-бит на 64 и не могу стартануть файлы, содержащие пробелы, хотя сам bash по TAB подставляет необходимого вида строку.

openSuse 11.2 x64
Спасибо сказали:
mrcashe
Сообщения: 18

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение mrcashe »

В двойные кавычки пробовал заключить?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение drBatty »

вчера перечислил 7 способов. вот восьмой, универсальный:

Всё заключаем в одиночные кавычки. После чего, внутренние одиночные кавычки меняем на '"'"'
бинго.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

В просто кавычки заключал, в смесь кавычек - не пробовал. Но это как то геморно получается, хотя, когда приспичит, можно испробовать. Я вообще имел ввиду, может у баша настройки какие или у миднайта что то не так?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение drBatty »

bakulenko писал(а):
16.02.2010 18:54
В просто кавычки заключал, в смесь кавычек - не пробовал.

вы не поняли!
не надо в смесь, заключайте всё в одиночные кавычки
единственное исключение, это если в имени есть такие кавычки, только в этом случае, внутренние кавычки меняются на комбинацию '"'"'

bakulenko писал(а):
16.02.2010 18:54
Я вообще имел ввиду, может у баша настройки какие или у миднайта что то не так?

нету настроек таких (ну почти, они вам не сильно помогут), дело в том, что НЕ ТОЛЬКО пробелы мешаются, есть ещё баксы, и прочая хрень (те-же кавычки)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Reboot
Сообщения: 321
Статус: Красен глаз -- темна душа

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение Reboot »

Перебил систему с 32-бит на 64 и не могу стартануть файлы, содержащие пробелы

а может нужно бинарники перекомпилировать? Или баш пишет "command not found" и абсолютно точно, что проблема только с файлами, содержащими пробелы?
anyway, думаю, что выложенный листинг того, что говорит bash был бы кстати
Мой компьютер зовут Марвин
Спасибо сказали:
WTakET
Сообщения: 73
ОС: Debian GNU/Linux squeeze/sid

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение WTakET »

drBatty, а где вы перечислили 7 способов? Перечислите ещё раз, здесь, пожалуйста. У меня что-то никак 7, то есть теперь даже 8, не получается =).
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение drBatty »

WTakET писал(а):
16.02.2010 19:34
drBatty, а где вы перечислили 7 способов? Перечислите ещё раз, здесь, пожалуйста. У меня что-то никак 7, то есть теперь даже 8, не получается =).

find, пробелы и массив

Reboot писал(а):
16.02.2010 19:22
а может нужно бинарники перекомпилировать? Или баш пишет "command not found"

как он такое напишет, если "сам по TAB подставляет"?

ЗЫЖ Вообще-то этот способ №4. №8 я ещё не придумал :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

Reboot писал(а):
16.02.2010 19:22
Перебил систему с 32-бит на 64 и не могу стартануть файлы, содержащие пробелы

а может нужно бинарники перекомпилировать? Или баш пишет "command not found" и абсолютно точно, что проблема только с файлами, содержащими пробелы?
anyway, думаю, что выложенный листинг того, что говорит bash был бы кстати


Дык, систему с нуля поставил. Так что, нечего особо перекомпиливать. Попробую еще перегрузиться в 32-битку, а то может меня склерох подводит, и я ни разу не включал файлы с пробелами.
Ругается, собственно, не баш, а мплейер, понимая имя файла как набор отдельных файлов, и ругается, мол не может их найти.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение NickLion »

Странно. OpenSUSE 11.2 x86_64 стоит. MPlayer из пакмана.
По-любому:

Код: Выделить всё

mplayer Neo\ Tokyo\ -\ \[a4e\].mkv
mplayer 'Neo Tokyo - [a4e].mkv'

Всё запускается без проблем.
bash:

Код: Выделить всё

nicklion@celestial:~> bash --version
GNU bash, version 4.0.35(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Спасибо сказали:
bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

NickLion писал(а):
17.02.2010 08:31
Странно. OpenSUSE 11.2 x86_64 стоит. MPlayer из пакмана.
По-любому:

Код: Выделить всё

mplayer Neo\ Tokyo\ -\ \[a4e\].mkv
mplayer 'Neo Tokyo - [a4e].mkv'

Всё запускается без проблем.
bash:

Код: Выделить всё

nicklion@celestial:~> bash --version
GNU bash, version 4.0.35(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


Попробую тогда свежий профиль сделать. Может косяк в том, что из 32-битки ломашнюю директорию подрубил как есть.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение drBatty »

bakulenko писал(а):
17.02.2010 07:55
Ругается, собственно, не баш, а мплейер, понимая имя файла как набор отдельных файлов, и ругается, мол не может их найти.

а что вы мучаетесь? ну переименуйте файл в 1.avi
или mv тоже ругается? тогда в mc нажмите SHIFT+F6 на файле.

ЗЫЖ и ещё: повторю, у вас в файле кроме пробелов могут быть кривые символы, например $, !, {, }, [, ] и многие другие.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

drBatty писал(а):
17.02.2010 09:53
bakulenko писал(а):
17.02.2010 07:55
Ругается, собственно, не баш, а мплейер, понимая имя файла как набор отдельных файлов, и ругается, мол не может их найти.

а что вы мучаетесь? ну переименуйте файл в 1.avi
или mv тоже ругается? тогда в mc нажмите SHIFT+F6 на файле.

ЗЫЖ и ещё: повторю, у вас в файле кроме пробелов могут быть кривые символы, например $, !, {, }, [, ] и многие другие.


Да меняется легко, но видеофайлы я раздаю на торрентах, имя там жестко задано, переименую, потом вспоминай после просмотра, как он там назывался.
Повторюсь, проблема не в том, что пробелы мешают, а в том, что раньше все тип-топ было, а сейчас вот так.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение drBatty »

bakulenko писал(а):
17.02.2010 11:28
Да меняется легко, но видеофайлы я раздаю на торрентах, имя там жестко задано, переименую, потом вспоминай после просмотра, как он там назывался.

ага. используйте команду ln

к примеру:

Код: Выделить всё

ln 'файл с пробелами и всякой фигнёй' 1.avi

эти ссылки практически не занимают место, и не отличимы от файла (на самом деле это тот-же самый файл, просто доступ к нему по другому имени)
bakulenko писал(а):
17.02.2010 11:28
Повторюсь, проблема не в том, что пробелы мешают, а в том, что раньше все тип-топ было, а сейчас вот так.

проблема в том, что я до сих пор так и не понял, какие имена вызывают у вас проблемы. сам по себе mplayer не режет имена на куски, их режет оболочка. разделители в $IFS, например у меня их 3 шт:

Shell

$ echo -n "$IFS" | od -t x1 0000000 20 09 0a 0000003

какие у вас, и все-ли вы их заэкранировали - не знаю. Проверьте. Либо у вас есть и другие разделители, либо вы какие-то не экранировали.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

drBatty
Так, с ссылками я знаком, а вот что такое экранирование - впервые слышу. Поковыряю на этот счет. Просто я то вряд ли что успел бы с этим сделать: 32-битка стоит от силы пару месяцев, да и то, времени особо не было ее ковырять, а 64 бита стоят с выходных, то есть, вообще ею еще не занимался, разве что настройки кед и все, что с ними связано, перенес через папку /home.

На всякий случай, # echo -n "$IFS" выдал пустую строку. Запустил по ssh. Дойду до дома, испробую еще там.

Код: Выделить всё

mplayer  -profile philips IronMaiden_Rock_in_Rio_1\(Live\ concert\).avi
Warning unknown option channel at line 10
MPlayer dev-SVN-r30099-4.4-openSUSE Linux 11.2 (x86_64)-Packman (C) 2000-2009 MPlayer TeamCan't open joystick device /dev/input/js0: No such file or directory
Can't init input joystick
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing IronMaiden_Rock_in_Rio_1(Live.
File not found: 'IronMaiden_Rock_in_Rio_1(Live'
Failed to open IronMaiden_Rock_in_Rio_1(Live.


Playing concert).avi.
File not found: 'concert).avi'
Failed to open concert).avi.


Exiting... (End of file)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение drBatty »

bakulenko писал(а):
17.02.2010 11:49
Так, с ссылками я знаком, а вот что такое экранирование - впервые слышу.

просто пробел - это пробел, обычно разделяет имена/слова в bash, а вот если перед пробелом обр. слеш - то это экранированный пробел - обычный символ, и слова не разделяет. так-же можно (нужно) экранировать $, #, ",... и многие другие спец-символы, если вы хотите их использовать как обычные.

bakulenko писал(а):
17.02.2010 11:49
На всякий случай, # echo -n "$IFS" выдал пустую строку.

ну и что?
у меня разве такая команда? или |od... я так, от балды писал?

bakulenko писал(а):
17.02.2010 11:49
Can't init input joystick

я бы джойстик (которого видимо у вас нет) для начала отключил-бы...

и профиль в конец команды поставил-бы..
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
bakulenko
Сообщения: 202
ОС: Ubuntu 12.04

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение bakulenko »

ну и что?
у меня разве такая команда? или |od... я так, от балды писал?


Виноват, писал уже в запарке, одной рукой, другой отмахивался от назойливых сотрудников.
Полная ваша команда выдала тот же резалт, что и у вас.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: имя файла, содержащее пробелы и командная строка bash

Сообщение sgfault »

drBatty писал(а):
17.02.2010 11:39
сам по себе mplayer не режет имена на куски, их режет оболочка. разделители в $IFS, например у меня их 3 шт:

Немного не по теме, но ведь IFS используется только для разбивки на слова результат bash expansion, а пробел в коммандной строке будет разделителем вне зависимости от значения IFS.

Например, возьмем такой скрипт lspp.sh, чтобы смотреть к-во аргументов:

Код: Выделить всё

#!/bin/bash

# simply list all positional parameters
declare -i i=0

echo "${0##*/}: positional parameters count: $#"
for ((i = 0; i <= $#; i++ )); do
    echo "${0##*/}: $i: '${!i}'"
done


тогда
#( IFS=" "; i="a b"; lspp.sh $i ) - два аргумента
#( IFS=""; i="a b"; lspp.sh $i ) - один аргумент
Но
#( IFS=" "; lspp.sh a b ) - два аргумента
#( IFS=""; lspp.sh a b ) - два аргумента

или я не прав?


PS. man bash:

Код: Выделить всё

 IFS    The Internal Field Separator that is used for  word  splitting  after
              expansion  and  to  split lines into words with the read builtin com-
              mand.  The default value is ``<space><tab><newline>''.

Но если не было expansion, не будет и word splitting.

PS2. пробел же всегда является разделителем (если не было expansion, те если он указан в явном виде), тк при разборе команды баш использует
info bash:

Код: Выделить всё

`blank'
     A space or tab character.

и

Код: Выделить всё

`metacharacter'
     A character that, when unquoted, separates words.  A metacharacter
     is a `blank' or one of the following characters: `|', `&', `;',
     `(', `)', `<', or `>'.

и

Код: Выделить всё

`word'
     A `token' that is not an `operator'.

и

Код: Выделить всё

`token'
     A sequence of characters considered a single unit by the shell.
     It is either a `word' or an `operator'.
Спасибо сказали: