Renomeie os arquivos no diretório de acordo com o nome do diretório

0

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>     

por SSK 28.08.2015 / 12:07

3 respostas

2

com zsh :

autoload zmv # best in ~/.zshrc
zmv '(XYZ??)(*)/(*)' '$1$2/$1$3'
    
por 28.08.2015 / 12:33
2

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
por 28.08.2015 / 12:38
0

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 .

    
por 28.08.2015 / 12:37