Удалите и замените все косые черты из имен файлов рекурсивно

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

Пример текущих имен файлов: от

Hello/there.txt
File/name.jpg

до

Hello_there.txt
File_name.jpg

Файлы находятся в разных подпапках одной и той же системы папок, а косые черты находятся в разных положениях. {{1 }} Я пробовал использовать команду rename следующим образом:

rename "s/\//_/g" *

Но мне не удалось добиться успеха. Не могли бы вы указать мне верное направление?

5
задан 14 May 2021 в 11:04

1 ответ

На основании вывода ls в вашем комментарии , рассматриваемый символ представляет собой дробную косую черту Unicode , а не обычную косую черту ASCII (что было бы недопустимо в имени файла Unix, поскольку он используется как символ разделителя пути).

В языковом стандарте UTF-8 (U + 2044, восьмеричное \ 342 \ 201 \ 204 или шестнадцатеричное 0xE2 0x81 0x84 ) является обычным символ, которым вы можете управлять / заменять обычным способом, например, с помощью команды perl rename . Пример:

$ touch hello⁄there.txt File⁄name.jpg

$ rename -n 's/\342\201\204/_/g' *
rename(File⁄name.jpg, File_name.jpg)
rename(hello⁄there.txt, hello_there.txt)

или

$ rename -n 's/\xe2\x81\x84/_/g' *
rename(File⁄name.jpg, File_name.jpg)
rename(hello⁄there.txt, hello_there.txt)

Удалите -n , как только вы будете довольны тем, что он поступает правильно.

Если вы хотите использовать find для рекурсивного перехода по каталогам, вы можете сделать это, например,

find . -type f -name "$(printf '*\342\201\204*')" -execdir rename -n 's/\342\201\204/_/g' {} +

(Если имя каталога может содержать \ 342 \ 201 \ 204 , и вы хотите заменить их, тогда вам нужно будет добавить -depth и удалить ограничение -типа f ).

7
ответ дан 28 July 2021 в 11:41

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

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