У меня есть Synology Nas, в котором много файлов с недопустимыми символами (Nas не предоставляет пользователям права доступа к файлу, если в имени есть такой символ), например * . " / \ [ ] : ; | = ,
Мне удалось получить CLI на коробке, и мне было интересно, есть ли способ изменить имена файлов во всех общих папках или изменить оскорбительные символы с помощью _
. Структура дерева файлов довольно глубокая.
4 ответа
'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, чтобы сначала увидеть эффект без изменений. строка выше заменяет все ":" на пробел.
Большое спасибо Марку Сетчеллу и 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"' \;
Вы можете использовать команду find
здесь:
find / -name "*" -exec ~/bin/some_script_that_will_rename_files.sh {} \;
и вам нужен скрипт, который будет переименовывать файлы, как вам нравится. Например, это может заменить всех персонажей чем-то другим.
Вопрос в том, есть ли у вас эти странные символы только внутри имен файлов или они также находятся в каталогах.
Посмотрите, сможете ли вы запустить на нем 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
.