Это rename-hash
сценарий я использую для переименования файлов к их hashsum, сохраняя расширение неизменным. Берет список файлов, которые будут переименованы как параметры. Использовать -n
как первый параметр для пробного прогона.
#!/bin/sh
unset DRY
[ "$1" == "-n" ] && { DRY=1; shift; }
for i in $@; do
if [ -f "$i" ]; then
HASHSUM=$(md5sum "$i" | sed 's/\(..........\).*/\1/')
DIR=$(dirname "$i")
BASE=$(basename "$i")
EXT=$(echo "$BASE" | sed -n 's/[^.]*\(\..*\)/\1/p')
TARGET="$DIR"/"$HASHSUM""$EXT"
if [ "$TARGET" != "$DIR/$BASE" ]; then
if [ -n "$DRY" ]; then
echo will rename "$i" to "$TARGET"
else
mv "$i" "$TARGET"
fi
fi
fi
done
Пример:
$ rename-hash -n *
will rename test.pdf to ./f604d0d6ad.pdf
will rename images.tar.gz to ./d41d8cd91b.tar.gz
Вы испытываете необходимость для выхода из всех символов в OLD_RULE, который может быть интерпретирован как символы волшебства шаблона. Или проще, используйте шаблон для соответствия строке, которой Вы хотите управлять на и затем только, чтобы выполнить минимальную замену, в которой Вы на самом деле нуждаетесь.
Что-то как (непротестированный) sed -i '/, NAME="eth1"/s/eth1/eth0/' /etc/udev/rules.d/70-persistent-net.rules
возможно.
Что-то, что могло бы иногда работать (и это работает здесь в этом конкретном примере) должно использовать printf
заключение в кавычки способности и sed -r
:
old_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"'
new_rule='SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:36:4c:e5", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"'
printf -v sed_repl 's/%q/%q/g' "$old_rule" "$new_rule"
sed -r -i "$sed_repl" /etc/udev/rules.d/70-persistent-net.rules