Не большая разница в результате для внешних команд. Выполнение env
просто включает дополнительный exec
для выполнения синтаксического анализа присваивания переменной, который в противном случае выполняла бы оболочка. env -i
был бы более полезен, так как он очищает среду, что не так просто сделать в оболочке.
В обоих случаях расширения, такие как подстановка команд VAR=$(somecmd)
, выполняются оболочкой до того, как произойдут назначения, и оба случая следуют за PATH
и т. д. Единственное различие, которое я могу придумать, это значение _
, который Bash устанавливает в имя команды, которую он запускает (, но env
нет ). Конечно, без env
вы также можете запустить встроенную версию команды оболочки.
Здесь вам не нужен rename
, вы можете обойти это:
$ file=35554842200284685106000166550020003504201637715423.xml
$ newname=$(sed -E 's/.*(.{48})/\1/'<<<"$file");
$ mv -v "$file" "$newname"
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'
Вот пример, использующий специфичный для bash P.E. расширение параметра.
file=35554842200284685106000166550020003504201637715423.xml
Только mv для внешних инструментов
mv -v "$file" "${file:6}"
Выход
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'
Сохранение последних 48 символов было бы.
mv -v "$file" "${file:(-48)}"
file=35554842200284685106000166550020003504201637715423.xml
rename "s/"$file"/"${file: -48}"/" *.xml
rename --version
:
/usr/bin/rename using File::Rename version 1.10
Ваш rename
кажется бесполезным из util-linux
.
Если вы хотите использовать регулярные выражения, вам следует убедиться, что вместо ((называемогоprename
)установлен один из вариантов на основе perl -. А потом:
rename -n 's:^\./\d+(?=\d{44}\.xml\Z)::'./*.xml
(здесь заменяет ваши 48 символов на 44 цифры, за которыми следует .xml
, чтобы быть более конкретным ).
В качестве альтернативы вы можете использовать zsh
'szmv
:
autoload zmv
zmv -n '[0-9]##([0-9](#c44).xml)' '$1'
Или
zmv -n '<->.xml~^?(#c48)' '$f[-48,-1]'
(снять-n
(пробный запуск -прогнать ), чтобы сделать это ).
Преимущество этого преимущества заключается в защите от конфликтов (двух файлов с одинаковым именем назначения)
С помощью bash
вы можете сделать что-то вроде:
shopt -s extglob nullglob
for f in +([[:digit:]]).xml; do
((${#f) <= 48)) || echo mv -i -- "$f" "${f: -48}"
done