При борьбе с этим и поиске с помощью Google это, кажется, не дает мне решение, которое работает.
Мне назвали папку...
file å?? name.txt
например, и избегать проблем, я хочу переименовать его однако, я изо всех сил пытаюсь удаться как. Я попытался использовать ' '
и я также пытался использовать \
перед каждым специальным символом, например. 'file \å\?\? name \(2008\).txt'
но я просто получаю следующую ошибку...
-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory
Это неправильное использование \
или мне нужен альтернативный подход?
Спасибо
Символы неASCII не являются проблемой, Ваша оболочка может иметь дело с å
отлично. Проблема - то, что Ваш файл на самом деле не называют å??
. Если это было, rm 'å??'
или даже rm å??
работал бы.
Вы предполагаете, что это å??
потому что это что ls
шоу, и это - разумное предположение, но ls
покажет различные вещи как ?
. Например:
$ mkdir "file å"\?\?" name.txt" "file å"$'\n'$'\n'" name.txt" "file å"$'\t'$'\t'" name.txt" "file å"$'\r'$'\r'" name.txt" "file å"$'\b'$'\b'" name.txt" "file å"$'\v'$'\v'" name.txt"
$ ls -l
total 24K
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:01 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov 8 13:02 file å?? name.txt
Как Вы видите выше, новые строки, вкладки, возвраты каретки, звонки и вертикальные вкладки (среди других) все показывают как ?
. Только первый файл/каталог тех созданных выше на самом деле имеет ?
на его имя. Мы можем подтвердить это с ls -b
:
$ ls -lb
total 24
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å??\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\b\b\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\t\t\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:01 file\ å\n\n\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\v\v\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov 8 13:02 file\ å\r\r\ name.txt
Так, можно или работать ls -b
получить правильное имя файла и затем использовать ANSI C заключающий в кавычки для переименования его:
mv å$'\r'$'\r' newname
С другой стороны, можно использовать шарик для соответствия всем файлам/каталогам, имя которых запускается с file å
(примечание: это будет только работать, если у Вас просто будет один):
mv "file å*" newname
Или, переименуйте все файлы/каталоги, имя которых содержит не алфавитно-цифровые символы (снова, только полезный для случаев, где у Вас есть сингл такой случай):
shopt -s extglob ## turn on extended globbing
mv !(*([[:graph:]])) newname
Странное !(*([[:graph:]]))
потребности некоторое объяснение. extglob
включает расширенный globbing, который позволяет нам использовать !(foo)
соответствовать "не нечто". [[:graph:]]
класс символов соответствует всем печатаемым символам (не вкладки, новые строки и т.д.) Поэтому отрицаемое соответствие !(*([[:graph:]]))
будет соответствовать всему file/dirnames непечатаемым символам.
Если необходимо иметь дело больше чем с одним таким случаем, используйте цикл. Что-то как:
for dir in !(*([[:graph:]])); do
mv "$dir" "${dir//[^[:graph:]]/_}";
done
${dir//[^[:graph:]]/_}
имя каталога со всеми непечатаемыми символами, замененными _
. Проблема с этим подходом состоит в том, что у Вас могут быть каталоги другого источника, которые закончатся с тем же именем (например. foo\n
и foo\t
оба станет foo_
). Если это - проблема, просто переименуйте использование счетчика также:
a=0; for dir in !(*([[:graph:]])); do
((a++));
mv "$dir" "${dir//[^[:graph:]]/_}$a"
done
Это привело бы к:
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt1
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt2
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt3
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å??_name.txt4
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt5
drwxr-xr-x 2 terdon users 4096 Nov 8 13:08 file_å___name.txt6
Далеко, поскольку я понимаю, что Вы хотите переименовать файл или папку, которая имеет неанглийские символы с помощью терминала.
Для этого, можно использовать
mv x y
, Где x является названием файла/папки, Вы хотите переименовать, и y является новым именем, которое Вы хотите для него.
, Если это имеет неанглийские символы и/или пробелы затем с помощью ' '
для определения пределов X и Y, должен сделать. Вот пример:
mv 'öld namé öf fileş' 'néw namé öf fileş'
исправьте меня, если я неправильно понял Ваш вопрос.
Вы ясно делали попытку выхода и заключения в кавычки, можно также использовать подстановочные знаки с раздражающими именами файлов, например,
$ ls *name\ 2008\ .txt <==== make sure you only get the one file
$ mv *name\ 2008\ .txt my_new_name.txt
, Если это не удовлетворяет потребности, сообщите мне - существуют другие подходы с помощью non-globbing.