Я хочу переименовать каждый файл в папка-подсистема, содержащая косую черту, которая должна быть заменена подчеркиванием
Пример текущих имен файлов: от
Hello/there.txt
File/name.jpg
до
Hello_there.txt
File_name.jpg
Файлы находятся в разных подпапках одной и той же системы папок, а косые черты находятся в разных положениях. {{1 }} Я пробовал использовать команду rename следующим образом:
rename "s/\//_/g" *
Но мне не удалось добиться успеха. Не могли бы вы указать мне верное направление?
На основании вывода 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
).