У меня есть Synology Nas, в котором много файлов с недопустимыми символами (Nas не предоставляет пользователям права доступа к файлу, если в имени есть такой символ), например * . " / \ [ ] : ; | = , Мне удалось получить CLI на коробке, и мне было интересно, есть ли способ изменить имена файлов во всех общих папках или изменить оскорбительные символы с помощью _ . Структура дерева файлов довольно глубокая.

4 ответа4

0

'brename' - это бинарный файл Go, который выполняет тяжелую работу.
потратил много времени, пытаясь найти решение в bash (синология nas это busybox, ubuntu is dash в настоящее время) regexing.
https://github.com/shenwei356/brename

у него есть бинарные файлы для linux 64-bit(в зависимости от возраста вашего nas).

SSH в ваш NAS, Wget скачать двоичный файл, по ссылке. взломать

./brename -d -R -p ":" -r "" /volume1 /share_name
(удалить -d --dry-run)

более длинный ответ:
(открыть терминал оболочки)
$ ssh admin @ nas_ip_adress_or_dns_name [вы можете позже $ sudo su root с паролем администратора] $ wget https://github.com/shenwei356/brename/releases/download/v2.7.0/brename_linux_amd64.tar.gz
$ tar -xvzf brename (нажмите Tab для автозаполнения)
затем
$ ./brename -R -p ":" -r "" /volume1 /share_name
добавьте --dry-run, чтобы сначала увидеть эффект без изменений. строка выше заменяет все ":" на пробел.

0

Большое спасибо Марку Сетчеллу и mko за их помощь. Я закончил со следующими командами

find . -iname "*:*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*<*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*>*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*|*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*?*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*[*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*]*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*\*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
0

Вы можете использовать команду find здесь:

find / -name "*" -exec ~/bin/some_script_that_will_rename_files.sh {} \;

и вам нужен скрипт, который будет переименовывать файлы, как вам нравится. Например, это может заменить всех персонажей чем-то другим.

Вопрос в том, есть ли у вас эти странные символы только внутри имен файлов или они также находятся в каталогах.

0

Посмотрите, сможете ли вы запустить на нем Perl:

perl -v

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

touch "Freddy :;|=, Frog"                         # create file with mad name

rename --dry-run 's/[:;|=,]/_/g' *Frog            # see what it would become
'Freddy :;|=, Frog' would be renamed to 'Freddy _____ Frog'

Я сделал несколько других примеров - смотрите здесь.


Если вы не можете использовать rename , то вы можете использовать что-то вроде этого, но, пожалуйста, сначала протестируйте его на некоторых копиях нескольких файлов и сделайте резервную копию перед запуском.

Здесь я просто тестирую файлы GIF, поэтому я не делаю беспорядок. Кроме того, я на самом деле ничего не делаю, я просто вывожу то, что я буду делать:

find . -iname "*gif" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); echo "mv {} $new"' \;

Если это выглядит правильно, вам нужно выполнить следующую команду:

find . -iname "*gif" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;

что немного отличается, потому что нет echo и мне нужно двойные кавычки параметров для mv .

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