Например, у меня есть 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 в мою synology nas с помощью Debian Chroot с https://synocommunity.com/, так что теперь все в порядке.

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

find . -iname \*\ \*.\*|rename 's/\ /\./g'

3 ответа3

2

Если у вас нет команды rename , вы можете сделать это с помощью небольшого сценария оболочки, который, похоже, также поддерживает ash busybox (это рекурсивно):

find -type f -name \*.mkv | while read f; do
    n=${f/ /_} # replace spaces
    n=${n/(/}  # remove opening bracket
    n=${n/)/}  # remove closing bracket

    mv -v "$f" "$n"
done

Обратите внимание, что это сломается, если имена папок также будут содержать пробелы или скобки.

1

Большинство дистрибутивов Linux включают утилиту linux, которая дает вам команду rename . Вы можете сделать то, что вы просите, выполнив эти команды:

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

Вы можете поэкспериментировать с опциями, это довольно гибко. Если вы хотите сделать это рекурсивно, объедините команду rename с командой find следующим образом:

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

Это объясняется в руководстве; наберите man find или man rename чтобы прочитать их.


Помните, что некоторые дистрибутивы, очевидно, включают в себя другую команду, которая принимает регулярные выражения Perl. Если у вас тоже, вам понадобится немного другой синтаксис:

rename 's/\ /./g' *.mkv
rename 's/[\)\(]//g' *.mkv
0

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

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

#!/bin/bash

for file in ./*
do
  infile=`echo "${file:2}"|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 "${file:2}"|sed -e 's|[^A-Za-z0-9._-]|_|g'`
  mv "$infile" ${outfile} &
done

exit

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .