Troque a série de nomes de arquivos condicionalmente

2

Se tiver o seguinte problema: Eu tenho uma série de arquivos que vêm em pares (mas nem sempre). Há 2400 ?????? _ 001.jpg e 2400 ?????? _ 002.jpg. Eu preciso trocar o _001 e o _002. Então eu pensei que poderia fazer isso:

for f in $(find -type f -name "*_002.jpg"); do mv "${f}" "${f%_002.jpg}_003.jpg"; done
for g in $(find -type f -name "*_001.jpg"); do mv "${g}" "${g%_001.jpg}_002.jpg"; done
for h in $(find -type f -name "*_003.jpg"); do mv "${h}" "${h%_003.jpg}_001.jpg"; done

Estranhamente depois do passo 2 eu tenho * _003.jpg e * _002.jpg que são idênticos. O que está acontecendo aqui?

Então o problema fica um pouco mais difícil: eu só quero trocar se ambos os membros do par existirem. Às vezes existe apenas 2400 ?????? _ 001.jpg e 2400 ?????? _ 002.jpg está faltando. Se este é o caso, então eu quero deixar 2400 ?????? _ 001.jpg sozinho.

    
por dexter 31.07.2015 / 09:48

1 resposta

0

Tente isso em um shell bash :

find -type f -name "*_001.jpg" -print0 | while read -d $'
#!/bin/bash
find -type f -name "*_001.jpg" -print0 | while read -d $'
find -type f -name "*_001.jpg" -print0 | while read -d $'
#!/bin/bash
find -type f -name "*_001.jpg" -print0 | while read -d $'%pre%' f; do
  t=$(mktemp --tmpdir=$(dirname "$f"))
  [ -f "${f%_001.jpg}_002.jpg" ] && \
    mv -v "$f" "$t" && \
    mv -v "${f%_001.jpg}_002.jpg" "$f" && \
    mv -v "$t" "${f%_001.jpg}_002.jpg"
done
' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "${f%_001.jpg}_002.jpg" ] && \ mv -v "$f" "$t" && mv -v "${f%_001.jpg}_002.jpg" "$f" && mv -v "$t" "${f%_001.jpg}_002.jpg" done
' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "${f%_001.jpg}_002.jpg" ] && \ mv -v "$f" "$t" && \ mv -v "${f%_001.jpg}_002.jpg" "$f" && \ mv -v "$t" "${f%_001.jpg}_002.jpg" done
' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "${f%_001.jpg}_002.jpg" ] && \ mv -v "$f" "$t" && mv -v "${f%_001.jpg}_002.jpg" "$f" && mv -v "$t" "${f%_001.jpg}_002.jpg" done

Como um script , ele deve ficar assim (um pouco mais legível):

%pre%

Explicação:

  • Primeiro, criamos uma lista de arquivos com find . Para processar nomes de arquivos estranhos use -print0 para delimitar arquivos com o nullbyte
  • while read -d $'find' f : Leia a saída de %code% delimitada pelo nullbyte
  • Criar um arquivo temporário
  • Verifique se ambos os arquivos existem
  • Mova o original (001) para o arquivo temporário
  • Mover 002 para 001
  • Mover o arquivo temporário para 002
por 31.07.2015 / 10:52