Massa mv em arquivos e alteração de nomes de arquivos [duplicados]

0

Eu quero alterar esses nomes de arquivos

download (19).download
...
download (27).download

para

download (19).html
...
download (27).html

Eu corro sem sucesso

mv *.download *.html
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Como você pode mudar o nome do arquivo? Eu acho que preciso de um regex aqui provavelmente.

    
por Léo Léopold Hertz 준영 03.04.2014 / 15:47

4 respostas

4

Você só pode usar mv para mover vários arquivos para um único diretório em chamada. Uma opção aqui é usar prename ( rename está vinculado a isso na maioria dos sistemas, mas não em todos):

prename -n 's/download$/html/' -- *.download

Remova -n quando tiver certeza de que está fazendo o que você deseja. Outra maneira é simplesmente usar um loop:

for file in *.download; do
  mv -i -- "$file" "${file%download}html"
done

A opção -i é adicionada mv para avisar se algum arquivo for sobrescrito. Remova isso se tiver certeza de que não substituirá nenhum arquivo necessário.

    
por 03.04.2014 / 16:02
1

mv não funciona dessa maneira. Você precisa de outra ferramenta como rename ou mmv . Por favor, tenha em mente que existem duas versões de rename ao redor.

E, claro, o shell pode fazer isso (com mv ):

for file in *.download; do
  fbasename="${file%.download}"
  if [ -e "${fbasename}.html" ]; then
    echo "${fbasename}.html exists; skipping."
    echo "${fbasename}.html exists; skipping." >>rename.log
    continue
  else
    echo mv -- "$file" "${fbasename}.html"
  fi
done

Remova o echo após o teste.

A maneira mmv :

mmv -n '*.download' '#1.html'

-n impede a execução e mostra o que seria feito.

    
por 03.04.2014 / 16:06
0

rename 's/download$/html/' *.download deve funcionar para você

    
por 03.04.2014 / 16:03
0

Se você tiver zsh shell disponível, zmv fará quase exatamente o que você deseja, com uma sintaxe muito semelhante:

zmv '*.download' '$1.html'

Apenas para indicar por que sua tentativa foi errada e perigosa: os curingas *? são expandidos pelo seu shell antes de o comando ser chamado. Portanto, mv na verdade recebe toda a lista de arquivos em vez de *.download , mas *.html tem duas maneiras de se comportar (ambas muito ruins):

Se *.html não existir, seu shell deixará o asterisco como parte do nome do arquivo. Você está tentando mover todos os downloads para o mesmo arquivo chamado *.html . mv avisa que não é um diretório (senão você sobrescreveria este arquivo várias vezes e acabaria com *.html contendo o último download). Se *.html encontrar um ou mais arquivos, o shell expandirá isso em uma lista de arquivos. Espero que nenhum deles seja um diretório, então isso falha novamente pelo mesmo motivo.

Note que você tem muita sorte, pode ter perdido dados dessa maneira.

    
por 03.04.2014 / 16:53

Tags