Renomeia a primeira parte de múltiplos arquivos com mv [duplicado]

6

Em um diretório existem esses arquivos e mais:

  • file1.txt
  • file1.html
  • file1.pdf
  • ...

Todo arquivo1 deve ser substituído por newfile :

  • newfile.txt
  • newfile.html
  • newfile.pdf
  • ...

Eu tentei:

for f in $(ls file1*); do mv $f newfile*; done

isto substitui todos os arquivos com arquivo1 para um arquivo newfile * .

for f in $(ls file1*); do mv $f ${f/$f/"newfile"}; done

isso também substitui todos os arquivos com arquivo1 para um arquivo newfile . Ou

find . -name "file1.*" -exec sh -c 'mv I DONT KNOW' _ {} \;

Eu não entendo como definir uma parte do nome do arquivo como uma variável e substitua isso.

Qual é a maneira mais simples de fazer isso com o mv?

    
por Sun 05.09.2015 / 04:05

6 respostas

5

Se você estiver executando no Linux, a maneira mais fácil de obtê-lo é usar rename (que faz parte do pacote util-linux :

rename 'file1' 'newfile' file1*

Isso fará o que você descreveu. O rename espera três argumentos:

  1. o que procurar no nome do arquivo
  2. o que usar como substituto
  3. uma máscara de arquivo para trabalhar em

Eu pesquisei rapidamente em rename e esse foi o primeiro hit com exemplos: link

UPDATE Se você não tem rename no seu sistema, mas tem bash , então você pode renomear um lote da seguinte maneira (isto é equivalente a rename dado acima):

for f in file1*; do mv -v "$f" "${f/file1/newfile}"; done
    
por 05.09.2015 / 07:51
5

Tente:

for f in ./file1.*; do
  echo mv "$f" "newfile.${f##*.}"
done

O código só exibe o que os comandos mv serão. Quando isto é o que você quer, remova o echo na frente do comando mv.

    
por 05.09.2015 / 04:20
1

Use expr para obter a última parte de cada nome. Estou assumindo aqui que você sabe que o prefixo é "file1", caso contrário você pode precisar de outro loop.

for f in $(ls file1.*)
do
suffix='expr $f : '.*\.\(.*\)''
mv -v file1.${suffix} newfile.${suffix}
done

Observe que, para fazer isso corretamente, você pode querer verificar se o destino ainda não existe ou usar o sinalizador "-n" em mv para evitar a supressão de um arquivo existente.

    
por 05.09.2015 / 04:26
1

Com o GNU find:

find . -maxdepth 1 -name "file1*" -printf "%f
find . -maxdepth 1 -name "file1*" -printf "%f%pre%" | xargs -0 -I {} echo mv -v {} new{}
" | xargs -0 -I {} echo mv -v {} new{}

Se tudo estiver correto, remova echo .

    
por 05.09.2015 / 07:44
1

Em sistemas baseados em Debian, o utilitário rename é renomeado em Perl e tem uma sintaxe ligeiramente diferente:

rename 's/file1/newfile/' file1*

O primeiro argumento é uma expressão Perl que será aplicada a cada nome de arquivo encontrado.

    
por 05.09.2015 / 18:50
0

Com a ajuda da resposta do @ cuonglm, descobri o que estava faltando:

find . -name "file1.*" -exec sh -c 'mv "$1" "newfile.${1##*.}"' _ {} \;
    
por 05.09.2015 / 21:10

Tags