Como usar o 7z com variáveis dentro de um script linux?

1

Por exemplo:

7za e -y $file_name -o$dest_directory

Isso funciona bem, quando executado diretamente a partir da linha de comando, mas dentro do script, ele apresenta este erro:

could not find archive (No archive by that name).

Eu tentei usar:

7za e -y 'ls -a | grep 001' -o'pwd' 

Isso extrai os arquivos com sucesso, mas os arquivos não são encontrados em lugar nenhum, quando o script termina.

    
por Bhavya Maheshwari 02.02.2013 / 07:38

1 resposta

2

Copie e cole seu script do comentário acima com quebras de linha adicionadas nos sinais ; para legibilidade:

!/bin/bash
printf "%s\n" "Please enter full path to the vmfile location e.g. /path/to - "
read
vmfile_path=$REPLY
cd $vmfile_path
7za e -y ls -a | grep 001 -o'pwd'
  • Para começar, a primeira linha deve ser #!/bin/bash , mas acho que é um erro de digitação.

  • Seu comando read e a linha subsequente são mais fáceis de serem gravados como apenas read vmfile_path . Dessa forma, o shebang também pode ser alterado para #!/bin/sh , já que você não estará usando nenhuma função específica do Bash.

  • Você deve citar o argumento cd para manipular nomes de diretório com espaços.

  • Eu suponho que você queira extrair um arquivo cujo nome contenha a string 001 na última linha. No momento está faltando alguma substituição de processo, e sua intenção provavelmente está mais próxima de:

    7za e -y $(ls -a | grep 001) -o$(pwd)
    

    A sintaxe $() é mais fácil de ler (e tem outras vantagens) em comparação com os backticks, mas faz a mesma coisa.

    Eu também acho que o diretório de saída é padronizado como pwd output, o que o torna supérfluo, mas não tenho certeza.

  • Seu comando não vai gostar se houver mais de um nome de arquivo correspondente a 001 .

Ignorando o último problema, você deseja no total algo como:

#!/bin/sh
printf '%s\n' "Please enter full path to the vmfile location e.g. /path/to - "
read vmfile_path
cd "$vmfile_path"
7za e -y "$(ls -a | grep 001)" -o"$(pwd)"

Ou, mais simples, substitua as duas últimas linhas por (também lida com várias correspondências) (embora não tenha sido testado):

find "$vmfile_path" -maxdepth 1 -name '*001*' -exec 7za e -y -o"$vmfile_path" {} \;

O padrão de correspondência de nomes provavelmente poderia ser melhorado se você conhecer mais o nome do arquivo.

    
por 02.02.2013 / 14:43