renomeia todos os arquivos em uma pasta excluindo partes de string duplicadas

0

Eu tenho uma pasta com muitas subpastas, que contêm duas vezes o mesmo, mas um pouco diferente:

Movie1 {Action}{Adventure}{Sci-Fi}{Thriller}{Science Fiction}/
Movie2 {Action}{Adventure}{Thriller}{Science Fiction}/
Movie3 {Action}{Adventure}{Thriller}{Sci-Fi}}/
Movie4 {Action}{Adventure}{Thriller}/

Como faço para unificá-los, excluindo a parte "{Ficção Científica}", onde "{Sci-Fi}" já existe, renomeando os fodlers que não contêm "{Sci-Fi}", mas apenas "{Ficção Científica } "?

Eu gostaria de fazer um loop:

for f in *; do
  if [ *"{Science Fiction}"* == "$f" ] && [ *"{Sci-Fi}"* == "$f" ]; then
    #delete the "{Science Fiction}" part
  else ...
  fi
done

Mas isso não parece muito elegante. existe uma solução mais limpa?

    
por rubo77 10.01.2016 / 01:08

1 resposta

1

Você pode usar o sed para remover as duplicatas da string:

for f in *; do
  r=$(echo $f | sed -r "s/(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)//g");
  echo $r;
done

Substitua echo $f por mv "$f" "$r" se você gostar da saída.

A linha sed acima pegará a primeira palavra correspondente e removerá a segunda, se você quiser sempre priorizar Sci-Fi sobre Science Fiction , mesmo quando apenas Science Fiction existir, você poderá fazer isso em duas etapas:

for f in *; do
  r=$(echo $f | sed "s/{Science Fiction}/{Sci-Fi}/");
  s=$(echo $r | sed -r "s/(.*)(\{Sci-Fi\})(.*)(\{Sci-Fi\})(.*)//g");
  if [ "$f" != "$s" ]; then
    echo "moving " $f " to " $s
  fi
done
    
por 10.01.2016 / 02:13