Как из другого ответа я узнал, что я должен использовать
rename "s/$dir\/[0-9]/$dir\/$dir/" $dir/*
На всякий случай, если у кого-то есть такая же проблема ...
У меня есть такая структура файла:
Таким образом, есть папки с 8-значными именами, содержащими один или несколько файлов, имена которых начинаются с 8-значных чисел. Но эти имена файлов - скажем так - не синхронизированы. Итак, теперь я пытаюсь рекурсивно переименовать их в bash для архивирования:
Мой сценарий выглядит так:
#! /bin/bash find * -maxdepth 1 -name "*" -type d | while read -r dir do rename 's/$dir\/[0-9]/$dir/' * done
Но это не работает и дает такие ошибки, как
Глобальный символ "$ dir" требует явного имени пакета в (eval 1) строке 1.
Как я мог написать это, чтобы переименовать файлы в соответствии с именами их папок?
Спасибо за помощь!
Как из другого ответа я узнал, что я должен использовать
rename "s/$dir\/[0-9]/$dir\/$dir/" $dir/*
На всякий случай, если у кого-то есть такая же проблема ...
I do not really like the answer where $dir
is interpolated into the pattern. It could lead to unexpected results if the directory would e.g. contain a character that gets interpreted as a special regexp token.
I would rather match the files directly in the pattern, negating the need to loop over the directories and just use a regular glob.
rename 's#([^/]+)/[^/]+(\.file[0-9]+)$#$1/$1$2#' base_directory/*/*
where the glob hits the individual files within the directories (it could even be specified to base_directory/*/*.file*
, or similar, but it should not matter here).
Note that this is the full command, without need for the find
construction.
#
as separator instead of the "regular" /
to avoid having to escape that in the patterns.I chose to use a more general approach than to assume that the files were all 8 characters long, but the real difference is that I neither need the find
construct nor to cram the $dir
variable into the (possibly unsafe) regexp environment.