Extrai uma lista de arquivos .zip em um novo diretório cada, nome do diretório a ser tirado do nome do arquivo zip

2

Eu tenho uma pasta contendo muitos arquivos .zip . Eles são assim chamados:

John-Rupert A. Doe_nnnnnnn_assignsubmission_file_*.zip

onde n é um dígito, * é uma string e John-Rupert A. Doe é uma string que pode conter espaços, pontos e traços.

Para cada um deles, quero fazer o seguinte:

  1. crie um diretório. Eu faço isso via:

    ls | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-' | xargs -L 1 mkdir
    

    (Então, o nome do diretório correspondente para o exemplo acima seria JohnRupertADoe )

  2. Agora quero extrair cada arquivo .zip para o diretório criado usando este nome de arquivo .zip . Mas como?

por spilot 21.11.2015 / 22:34

2 respostas

3

Você pode tentar:

for z in ./*.zip
do name="${z%%_*}"; dest=".${name//[ .-]/}"; mkdir "$dest"; unzip "$z" -d "$dest"
done

Para cada arquivo z ip, ele extrai a parte do nome ( ${z%%_*} exclui o sufixo com avidez) e remove qualquer ocorrência de ponto, traço e espaço ( ${name//[ .-]/} ) e passa a string resultante como um argumento para mkdir para criar o diretório correspondente. Em seguida, descompacta o arquivo para o d estination especificado.

    
por 21.11.2015 / 23:14
0

Não testado:

for i in *.zip; do
  zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-'; }
  zipdir | xargs -L 1 mkdir
  mv "$i" "$(zipdir)"/
done

Ou para remover os dois tr pipes, você poderia adicionar ao seu pipe sed (também não testado):

for i in *.zip; do
  zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g;s/.//g;s/-//g'; }
  zipdir | xargs -L 1 mkdir
  mv "$i" "$(zipdir)"/
done
    
por 21.11.2015 / 22:45

Tags