rm nomes de arquivos correspondentes por padrão

1

Eu tenho mais de 42000 epubs do Project Gutenberg. Muitas vezes, uma versão tem uma versão de imagens e uma versão sem imagens. Eu quero remover as cópias sem imagem se houver uma cópia de imagem.

...
pg16045-images.epub
pg16045.epub
pg506.epub
...

Neste caso, eu gostaria de remover o pg16045.epub porque o pg16045-images.epub existe, mas não o pg506.epub, pois o pg506-images.epub não existe.

Como posso fazer isso a partir da linha de comando? Estou usando o shell TCSH, mas posso alternar para BASH, se necessário.

    
por user274895 18.11.2013 / 05:16

4 respostas

1

Isso exclui todos os arquivos epub em /somewhere recursivamente se eles tiverem um arquivo -images correspondente.

find /somewhere -name '*-images.epub' -exec bash -c '
    f="${0//-images/}"
    [[ -f "$f" ]] && echo rm -- "$f"
' {} \;

Remova o echo quando tiver certeza de que está correto.

    
por 18.11.2013 / 09:04
0

Isto irá encontrar todas as suas ' -images.epub' e então tentará remover o diretório correspondente ' .epub', sem verificar se existe ou não.

#!/bin/sh   

for d in *-images.epub ; do
  rmname='echo "$d" | sed -e 's/\(.*\)-images\(\.epub\)//''
  echo rm "$rmname"
done

# end of file.

Remova o 'echo' do início da linha para que isso realmente funcione. É uma boa idéia primeiro fazer o eco dos comandos para o terminal e ver se é isso que você realmente quer fazer antes.

    
por 18.11.2013 / 08:42
0

Isso talvez seja um pouco mais curto:

 find /path/to/target/directory -name '*images.epub' -exec sh -c ' echo '{}' | sed 's/-images//' | xargs  echo rm -f  ' \;
    
por 18.11.2013 / 14:59
0

Isso deve fazer o truque

DIR="/home/xyzuser/testdir"
for i in $(ls "$DIR");
do
  if [[ "$i" == *.images.epub  ]]
  then
    var=${i%.*}
    var=${var%.*}
    if [[ -f "$DIR/$var.epub" ]]
    then
      rm "$DIR/$var.epub"
    fi
  fi
done

Basta alterar o valor DIR para onde quer que seus arquivos estejam. Se você está armazenando este script em um arquivo, não se esqueça de torná-lo executável com

chmod +x filename.sh
. Caso contrário, você não poderá executá-lo. O que isso faz é basicamente.
  1. Faz um loop por todo o arquivo (nome) s
  2. Se um arquivo tiver "images.pub", ele cortará a parte ".images.epub" do nome do arquivo
  3. Em seguida, verifica se algum arquivo com um sufixo ".epub" (parte final) tem o prefixo atual do arquivo ".images.epub" (parte inicial). E, se encontrado, será excluído.
por 18.11.2013 / 18:06

Tags