com zsh :
autoload zmv # best in ~/.zshrc
zmv '(XYZ??)(*)/(*)' '$1$2/$1$3'
Estou tentando renomear um monte de arquivos de acordo com os nomes de seus diretórios no Linux, SSH.
Eu tenho um diretório chamado XYZ01smith . Nele, há quatro arquivos chamados smith_5* .Eu preciso adicionar o prefixo XYZ01 a esses arquivos.
Mas , o próximo diretório é chamado XYZ02perry . Nele estão quatro arquivos chamados perry_3* . Eu preciso adicionar o prefixo XYZ02 a esses arquivos.
Eu tenho um loop para fazer isso por diretório:
for i in smith_5*;
do mv ${i} XYZ01${i};
done
Mas eu tenho 50 diretórios ( XYZ01name to XYZ50name ), então eu prefiro poder fazer isso com um script para todos os 50. Eu tenho certeza que isso deveria ser possível, mas eu não sei como. / p>
com zsh :
autoload zmv # best in ~/.zshrc
zmv '(XYZ??)(*)/(*)' '$1$2/$1$3'
com bash :
for f in XYZ*/*; do mv -v "$f" "${f%/*}/${f:0:5}${f##*/}"; done
O loop for é executado em todos os diretórios XYZ* . Em seguida, o comando mv renomeia os arquivos.
Onde:
$f é o nome do arquivo original ${f%/*} é o nome do diretório ${f:0:5} é o prefixo ${f##*/} é o nome do arquivo original Você pode executar este comando, que apenas mostra o que ele faria:
ls -d XYZ*/* |
sed -n s'|\(XYZ[0-9][0-9]\)\([^/]*\)/\(_.*\)|mv & /|p' |
cat
e se você gostar dos comandos a serem executados, substitua cat por sh .