Como esperar antes que o comando mv seja concluído no unix?

1

Eu preciso compactar alguns arquivos, mover arquivos compactados para outro diretório usando o comando mv e, em seguida, remover todos os arquivos do local original. Mas no meu caso, o comando rm está sendo executado antes do comando mv e do comando mv com falha.

Eu tentei abordagens abaixo, mas isso não ajudou.

Abordagem 1:

$ zip -r foo.zip * &;  wait %1 && mv foo.zip mydir &; wait %1 && rm -rf *

Abordagem 2:

[ zip -r foo.zip *] || {mv foo.zip mydir && rm -rf *}
    
por Vijay Shinde 11.01.2017 / 19:49

1 resposta

5

Você está complicando isso.

Se zip sair com um status de saída que reflita sucesso ou falha, você pode simplesmente fazer

$ zip -r foo.zip . && mv foo.zip mydir && rm -rf *

No entanto, espero que mydir não esteja localizado no diretório atual ou seja excluído pelo rm -rf * . Em geral, ao usar rm -rf , eu pensaria duas e três vezes antes de colocar um * depois dele !! Na verdade, posso contar o número de vezes que fiz ( rm -rf * ) no ano passado nos dedos de uma mão. Eu nunca colocaria em um script.

Caminho mais seguro (supondo que mydir seja realmente um caminho para algum outro lugar que não o diretório atual):

$ zip -r --move --test foo.zip . && mv foo.zip mydir

Ou até mesmo

$ zip -r --move --test mydir/foo.zip .

Observe o uso de . (ponto) em vez de * . Com * , qualquer arquivo com - como o primeiro caractere em seu nome seria interpretado como uma opção de linha de comando para zip . Teste isso criando um arquivo chamado --encrypt , por exemplo:

$ touch -- --encrypt
$ zip -r --move --test ../test.zip *
Enter password:

$ rm -- --encrypt
    
por 11.01.2017 / 19:58

Tags