Как я могу сказать bash правильно экранировать расширенные строки? - PullRequest
4 голосов
/ 05 февраля 2010

Предположим, у меня есть каталог, содержащий файлы

foo bar.txt  
foo baz.txt

(каждый с пробелом между 'o' и 'b'). Предположим, я хотел бы сделать это:

for f in *.txt; do mv ${f} `basename ${f} .txt`; done

Это невозможно, потому что bash расширяется *.txt до

foo bar.txt foo baz.txt

вместо

foo\ bar.txt foo\ baz.txt

т.е. правильно сбежал, как если бы я использовал завершение табуляции.

Как я могу получить bash для правильного экранирования?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2010

Вы помещаете кавычки в свои переменные. Таким образом, вы сохраняете пространство. Также нет необходимости использовать внешнюю команду basename. оболочка может сделать это для вас. (при условии, что вы используете bash)

for file in *.txt
do
 mv "$file" "${file%.txt}"
done
2 голосов
/ 05 февраля 2010

Или, если это одна операция, вы можете использовать vim:

> ls -al
foo bar.txt
foo baz.txt

Откройте vim и выполните:

:r!ls *.txt

Это загружает файлы, затем выполняет:

:%s/\(\(.*\)\.txt\)/mv "\1" "\2"/gc

Это заменит строки на:

mv "foo bar.txt" "foo bar"
mv "foo baz.txt" "foo baz"

Выделите все с помощью Ctrl-v вниз, затем введите : и введите остальную часть этой команды:

:'<,'>!bash

Это выполнит выделенные команды в bash. Выйдите из vim и проверьте ваш каталог:

> ls
foo bar
foo baz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...