find -name "*_[1-9].txt" -exec sh -c 'echo $1 ${1%_*}_0${1##*_}' _ {} \;
$1
está sustituyendo con el archivo encontrado. ${1%_*}
está eliminando todo después de el último guión bajo y el propio guión bajo. _0
solo imprime un guión bajo seguido de un cero. ${1##*_}
elimina todo antes de el último guión bajo y el propio guión bajo. reemplace echo
con mv
para cambiar el nombre de los archivos.
Usé esto para crear 3o archivos
touch Var1_${RANDOM}_Var2_${RANDOM}_Var3_${RANDOM}_data_{1..30}.txt
Ваша команда делает что-то очень похожее на то, что вы хотите :она расширяется до списка имен файлов, которые не точно :a
, b
или c
. Если вы проверите, вы увидите:
$ touch a b c d
$ ls *[!abc]*
d
Но если вы создадите другой файл и повторно -проверите:
$ touch argh
$ ls *[!abc]*
argh d
Чтобы исключить имена файлов, которые где-либо содержат эти символы, используйте:
$ shopt -s extglob
$ ls !(*[abc]*)
d
Еще один способ сделать это (снова с помощью расширенных глобусов )— явно перечислить шаблоны:
$ ls !(*a*|*b*|*c*)
d