Renomeie todos os arquivos no diretório de $ filename_h para $ filename_half?

139

Simplesmente morto.

Como renomear

05_h.png
06_h.png

para

05_half.png
06_half.png

Pelo menos, acho que é simples, mas é difícil usar o Google para esse tipo de coisa, a menos que você já saiba.

Obrigado....

Richard
fonte

Respostas:

301

Basta usar o bash, sem necessidade de chamar comandos externos.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Não adicione #!/bin/sh

Para aqueles que precisam dessa linha:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
bash-o-logist
fonte
7
Uso agradável do bash built-in substituição de string ao invés de sed
dandrews
3
é o arquivo / _h.png / _half.png regex?
user2799603
15
Não, o formato é este: $ {string / substring / substitution} - "substitua a primeira ocorrência". Para mais informações, consulte esta folha de dicas (seção "strings"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider:
11
Alguma razão para Do not add #!/bin/sh? Eu tentei trabalhar com / sem esta declaração.
26915 Ryan
6
@Ryan @Ishan Jain De fato, indica o shell de back-end que deve executar o script. sh e bash são diferentes shells, portanto, podem afetar o comportamento e a sintaxe do script. Como o script usa uma substituição de string interna do bash, você deve adicionar o cabeçalho #!/bin/bash. Dito isto, o bash é normalmente o shell padrão em muitos computadores para que você não vai encontrar muitas diferenças: D Você pode encontrar mais informações aqui
Cristian Ramon-Cortes
65

Tente o renamecomando:

rename 's/_h.png/_half.png/' *.png

Atualizar:

exemplo de uso:

criar algum conteúdo

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

solução de teste:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png
Michał Šrajer
fonte
1
@CarolineAlexiou: Adicionei uma sessão de teste de exemplo. Por favor tente. Você provavelmente tem algum erro de digitação. Qual é a saída de ls? o que rename ...você está tentando?
Michał Šrajer
2
Não funciona no bash no Mac, fwiw. renamenão é uma ferramenta padrão do Unix.
precisa saber é o seguinte
1
@tandrewnichols, experimente homebrew - uma vez instalado, renomeação torna-se disponível em segundos combrew install rename
Simbamangu
4
quanto a mim, renomear não funcionou 's//'- referenciei man e houve uma simples sinopse rename [options] expression replacement file...rename from util-linux 2.23.2
:,
2
ter em mente que .corresponde a qualquer caractere, não apenas um ponto - para dot literal, use \.em vez
Meisner
11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done
Karoly Horvath
fonte
1
Isso é ótimo para fazer uma corrida a seco com antecedência. I primeiro substituído mv $f $fnewcom echo $fnewque a segunda linha para garantir que o sane aparência de saída.
lobati
10

Você está procurando uma solução pura para o bash? Existem muitas abordagens, mas aqui está uma.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Isso pressupõe que os únicos arquivos no diretório atual que terminam em _h.png são os que você deseja renomear.

Muito mais especificamente

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Presumindo que esses dois exemplos sejam seus únicos. arquivos.

Para o caso geral, a renomeação de arquivos foi abordada anteriormente .

sorpigal
fonte
6

Use o renameutilitário escrito em perl. Pode ser que ele não esteja disponível por padrão ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png
Fredrik Pihl
fonte
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
fonte
4

Eu tive uma pergunta semelhante: no manual, ele descreve renomear como

rename [option] expression replacement file

para que você possa usá-lo dessa maneira

rename _h _half *.png

No código: '_h' é a expressão que você está procurando. '_half' é o padrão que você deseja substituir. '* .png' é o intervalo de arquivos que você está procurando pelos possíveis arquivos de destino.

Espero que isso possa ajudar c:

James Yen
fonte
1

Outra abordagem pode ser manualmente usando a opção de renomeação em lote

Clique com o botão direito do mouse no arquivo -> Arquivo de comandos personalizados -> Renomear em lote e você pode substituir h. com metade.

Isso funcionará para a GUI baseada em Linux usando o WinSCP, etc.

Easwar
fonte
0

Use o renameutilitário:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png
C. Ramseyer
fonte
0

Um forro:
for file in *.php ; do mv "$file" "_$file" ; done

Jadeye
fonte
0

Embora o conjunto de respostas esteja completo, preciso adicionar outro ausente.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Tharindu Sathischandra
fonte