Как пакетно переименовать файлы, удалив специальный символ без использования переименования в оболочке Linux

2030
chenyi1976

Например, у меня есть 100 файлов и их имена имеют пустое пространство. Одним из них является " The Monkey King Return (2015).mkv".

Как убрать все пробелы в имени и заменить их символом точки, а также убрать "(" и ")"?

Результат должен быть " The.Monkey.King.Return.2015.mkv".

как я могу сделать это в партии?

На самом деле я запускаю сценарий оболочки на моем Synology NAS через ssh, который является дистрибутивом BusyBox Linux с установленными bash и ash, без gcc. Уже пытался в течение нескольких дней, не могу понять это должным образом.

Доступные инструменты: mv / xargs / sed / awk / другие стандартные linux cmd.

А как насчет рекурсивного переименования подпапок?

Редактировать: только что установил apt-get и переименовал cmd в мою синологию nas с помощью Debian Chroot с https://synocommunity.com/, так что теперь все в порядке.

Чтобы сделать человека, которому нужен простой ответ, cmd:

find . -iname \*\ \*.\*|rename 's/\ /\./g' 
0
Возможный дубликат [Как переименовать файлы с пробелами с использованием оболочки Linux?] (Http://superuser.com/questions/295994/how-do-i-rename-files-with-spaces-using-the-linux- ракушка) Anthony Geoghegan 8 лет назад 3

3 ответа на вопрос

2
Sjon

If you don't have the rename command, you can do this with a little shell scripting which busybox's ash also seems to support (this is recursive):

find -type f -name \*.mkv | while read f; do n=$ # replace spaces n=$ # remove opening bracket n=$ # remove closing bracket mv -v "$f" "$n" done 

Please note that will break if the folder-names also contain spaces or brackets.

1
Sjon

Most linux distro's include util-linux which gives you the rename command. You can do what you request by running these commands:

rename ' ' _ *.mkv rename '(20' 20 *.mkv rename ').' . *.mkv 

You can experiment with the options, it's pretty flexible. If you want to do this recursively, combine rename with the find command like this:

find . -type f -name \*.mkv -exec rename ' ' _ {} \; 

These are explained in the manual; type man find or man rename to read them.


Beware that some distro's apparently include a different command which accepts perl regular expressions. If yours does too, you'll need a slightly different syntax:

rename 's/\ /./g' *.mkv rename 's/[\)\(]//g' *.mkv 
Осторожно! По крайней мере, если ваш совпадает с моим, `rename` принимает регулярное выражение, а в регулярном выражении` .` соответствует * любому * отдельному символу. a CVn 8 лет назад 0
Ну, у меня нет, и man-страница подтверждает это, предоставляя следующий пример: `rename .htm .html * .htm`. Но я добавлю предупреждение, спасибо Sjon 8 лет назад 0
Я на самом деле запускаю сценарий оболочки на моем Synology NAS через ssh, который, к сожалению, не имеет команды «переименовать», возможно ли это сделать с помощью команды mv? chenyi1976 8 лет назад 0
@ chenyi1976 у тебя установлен bash? Перечислите свои ограничения в своем вопросе Sjon 8 лет назад 0
Обновленный билет, это дистрибутив BusyBox Linux с bash и ash, без gcc. chenyi1976 8 лет назад 0
@ Одна вещь, которую я обнаружил, это то, что система, подобная synology, на самом деле использует синтаксис sed: "rename 's / \ /\./g' * .mkv" chenyi1976 8 лет назад 0
0
ScriptKitty37

Я долго искал решение этой проблемы. Я работаю на старых закрытых системах, в которых не могут быть установлены новые пакеты. У меня нет renameкоманды. Наконец я написал скрипт, который работает со всеми введенными на клавиатуре специальными символами:~@#$%^&*()-_=+[]{}\|;:",<.>?'

Скрипт переименует каждый файл и каталог в текущем каталоге. Он заменит все специальные символы, кроме -_.с _характером. outfile=Линия может быть изменена, чтобы использовать другой символ для замены в случае необходимости. Замените |_|на, |.|чтобы использовать .символ например.

#!/bin/bash  for file in ./* do infile=`echo "$"|sed \ -e 's|"\"|"\\"|g' \ -e 's| |\ |g' -e 's|!|\!|g' \ -e 's|@|\@|g' -e 's|*|\*|g' \ -e 's|&|\&|g' -e 's|]|\]|g' \ -e 's|}|\}|g' -e 's|"|\"|g' \ -e 's|,|\,|g' -e 's|?|\?|g' \ -e 's|=|\=|g' ` outfile=`echo "$"|sed -e 's|[^A-Za-z0-9._-]|_|g'` mv "$infile" $ & done  exit