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
.