Переименуйте файлы и папки со специальными символами

При борьбе с этим и поиске с помощью Google это, кажется, не дает мне решение, которое работает.

Мне назвали папку...

file å?? name.txt

например, и избегать проблем, я хочу переименовать его однако, я изо всех сил пытаюсь удаться как. Я попытался использовать ' ' и я также пытался использовать \ перед каждым специальным символом, например. 'file \å\?\? name \(2008\).txt' но я просто получаю следующую ошибку...

-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory

Это неправильное использование \ или мне нужен альтернативный подход?

Спасибо

3
задан 8 November 2015 в 02:09

3 ответа

Символы не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
5
ответ дан 1 December 2019 в 15:37

Далеко, поскольку я понимаю, что Вы хотите переименовать файл или папку, которая имеет неанглийские символы с помощью терминала.

Для этого, можно использовать

mv x y

, Где x является названием файла/папки, Вы хотите переименовать, и y является новым именем, которое Вы хотите для него.

, Если это имеет неанглийские символы и/или пробелы затем с помощью ' ' для определения пределов X и Y, должен сделать. Вот пример:

mv 'öld namé öf fileş' 'néw namé öf fileş'

исправьте меня, если я неправильно понял Ваш вопрос.

0
ответ дан 1 December 2019 в 15:37

Вы ясно делали попытку выхода и заключения в кавычки, можно также использовать подстановочные знаки с раздражающими именами файлов, например,

$ ls *name\ 2008\ .txt    <==== make sure you only get the one file

$ mv *name\ 2008\ .txt  my_new_name.txt

, Если это не удовлетворяет потребности, сообщите мне - существуют другие подходы с помощью non-globbing.

0
ответ дан 1 December 2019 в 15:37

Другие вопросы по тегам:

Похожие вопросы: