Я пытаюсь переименовать такие файлы:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Но команда sed заменяет все пробелы на _.
Как я могу отредактировать sed, чтобы сделать его вложенным пространством вместе с указанными символами? Я попытался использовать \s, но он не работает ...
EDIT: Например: файл trip: hill, следует переименовать: trip_ hill, но команда выше делает его trip__hill.
Не разбирайте имена файлов с помощью sed! Вывод echo "$file" может оказаться ненадежным.
Используйте rename. В 17.10 вам нужно установить его сначала
sudo apt install rename
Затем:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Это также работает в sed:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Если я добавлю пробел в конец вашей версии, я получаю сообщение об ошибке:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
Но в конце - он работает:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
. Возможно, позиция дефиса вызвала вашу проблему, когда вы добавили пространство. Но совет не разбирать имена файлов стоит!
Не разбирайте имена файлов с помощью sed! Вывод echo "$file" может оказаться ненадежным.
Используйте rename. В 17.10 вам нужно установить его сначала
sudo apt install rename
Затем:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Это также работает в sed:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Если я добавлю пробел в конец вашей версии, я получаю сообщение об ошибке:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
Но в конце - он работает:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
. Возможно, позиция дефиса вызвала вашу проблему, когда вы добавили пространство. Но совет не разбирать имена файлов стоит!
Не разбирайте имена файлов с помощью sed! Вывод echo "$file" может оказаться ненадежным.
Используйте rename. В 17.10 вам нужно установить его сначала
sudo apt install rename
Затем:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Это также работает в sed:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Если я добавлю пробел в конец вашей версии, я получаю сообщение об ошибке:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
Но в конце - он работает:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
. Возможно, позиция дефиса вызвала вашу проблему, когда вы добавили пространство. Но совет не разбирать имена файлов стоит!
Вы также можете просто использовать оболочку, расширение параметра Bash может выполнять подстановку:
for f in ./* ; do
mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done
Двойная косая черта говорит ему заменить все совпадения, кроме этого, синтаксис прост. [!d2 ]
Вы также можете просто использовать оболочку, расширение параметра Bash может выполнять подстановку:
for f in ./* ; do
mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done
Двойная косая черта говорит ему заменить все совпадения, кроме этого, синтаксис прост.
Вы также можете просто использовать оболочку, расширение параметра Bash может выполнять подстановку:
for f in ./* ; do
mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done
Двойная косая черта говорит ему заменить все совпадения, кроме этого, синтаксис прост.