bat para substituir nomes por espaços

0

Eu tenho um grande número de arquivos com alguns nomes à frente do nome do arquivo real. A seguir, o exemplo do problema:

Nora Hmann - sub-01.zip
Nora Hmann - sub-02.zip
Nora Hmann - sub-03.zip
Nora Hmann - sub-04.zip
Nora Hmann - sub-05.zip
Nora Hmann - sub-06.zip

Agora usando sed commnd eu quero remover Nora Hmann - e manter sub-01.zip . alguém pode me ajudar com o comando sed como string a ser substituído contém espaços, sed não está fazendo o seu corretamente.

    
por learnningprogramming 10.01.2017 / 14:11

4 respostas

2

Use o seguinte comando:

sed -ie "s/Nora\ Hmann\ \-\ //g" stack

antes:

Nora Hmann - sub-01.zip
Nora Hmann - sub-02.zip
Nora Hmann - sub-03.zip
Nora Hmann - sub-04.zip
Nora Hmann - sub-05.zip
Nora Hmann - sub-06.zip

depois:

sub-01.zip
sub-02.zip
sub-03.zip
sub-04.zip
sub-05.zip
sub-06.zip

Para fazer um loop (suponho que você tenha executado o seu script do diretório, onde todos os arquivos que serão modificados estão localizados):

for i in 'ls -w1'
do
 sed -ie "s/Nora\ Hmann\ \-\ //g" /path/to/$i
done
    
por 10.01.2017 / 14:21
2

Apagar a lista desses nomes para o sufixo após o último espaço:

sed 's/.* //'

Mas, se houver alguns arquivos no diretório, é mais simples usar rename :

rename 's/^.* //' *
    
por 10.01.2017 / 14:29
1

Outra solução usando cut e sed :

cat filename.txt | cut -d'-' -f2- |  sed 's/^ //g'

Outro somente com cut (e somente no caso dos nomes serem compostos por nome e sobrenome separados por espaço):

cat filename.txt | cut -d' ' -f4-
    
por 10.01.2017 / 14:27
1

Com bash ou ksh , supondo que os arquivos estejam no diretório atual:

for name in ./"Nora Hmann - sub-"??.zip; do
  newname="./${name##* }"
  mv -i "$name" "$newname"
done

A expansão do parâmetro ${name##* } removerá tudo de $name até (e incluindo) o último caractere de espaço.

Se o nome no início do nome do arquivo não for fixo, o seguinte irá capturar todos arquivos Zip e tentar renomeá-los da mesma maneira:

for name in ./*.zip; do
  newname="./${name##* }"
  mv -i "$name" "$newname"
done

Eu optei por usar mv -i nesses exemplos para que você interativamente tenha que confirmar qualquer renomeação que substituiria um arquivo já existente.

Outra maneira de fazer isso seria simplesmente ignorar os arquivos que, de outra forma, substituiriam os arquivos existentes:

for name in ./*.zip; do
  newname="./${name##* }"
  if [[ ! -e "$newname" ]]; then
    mv "$name" "$newname"
  else
    printf 'Not renaming "%s", new filename exists\n' "$name" >&2
  fi
done
    
por 12.01.2017 / 20:33

Tags