Encontre arquivos com o mesmo nome mas extensões diferentes, envie para tgz

3

Eu tenho um grande arquivo de imagens editadas da minha câmera, cada imagem é na verdade um par de arquivos - * .nef & * .xmp. Eu gostaria de percorrer todas as pastas e, em seguida, compactar esses pares em arquivos tgz únicos.

Cada um dos nomes de arquivos em um diretório é único, então seria suficiente mover os nomes dos arquivos da saída de ls *.nef para o comando tar -czf {filename}.tgz {filename}.* , mas não tenho idéia de por onde começar.

Obrigado antecipadamente.

    
por Martin KS 19.05.2011 / 15:06

2 respostas

3

Um script curto, xfun:

#!/bin/bash
b=$(basename "$1" .xmp)
# echo "tar -cjf $b.tar.bz2 $b.xmp $b.nef"
tar -cjf "$b.tar.bz2" -- "$b.xmp" "$b.nef"

Invocação:

find -name "*xmp" -execdir ./xfun {} ";" 
    
por 19.05.2011 / 15:56
1

Em zsh ou bash ≥4:

for x in **/*.nef; do
  x=${x%.nef}
  if [ -e "$x.xmp" ]; then
    tar -czf "$x.tgz" -- "$x.nef" "$x.xmp" && rm -- "$x.nef" "$x.xmp"
  fi
done

Remova a parte && rm … se não quiser excluir os arquivos arquivados.

Remova a parte **/ na primeira linha para atuar apenas no diretório atual e não em seus subdiretórios (e, em seguida, o snippet funcionará em qualquer shell).

Algumas implementações tar antigas podem não suportar -z para criar um arquivo gzip; então você pode usar tar -cf "$x.tar" -- "$x.nef" "$x.xmp" && gzip -o "$x.tgz" -- "$x.tar" && rm … . Se você não quiser excluir os arquivos, outra possibilidade é tar -cf - -- "$x.nef" "$x.xmp" | gzip >"$x.tgz" (este formulário não pode ser combinado com && rm porque excluiria os arquivos de origem mesmo se o comando tar falhasse).

    
por 19.05.2011 / 23:18