Exclui todos os arquivos, exceto um em um diretório após a execução do script

1

Eu uso esse script para abrir documentos do Microsoft Office no Office Online para convertê-los em PDF (para meu trabalho) e preservar a formatação. Script para visualizar documentos do Office no Microsoft Office Online

O script basicamente copia o arquivo docx para o meu diretório ~ / Dropbox / Public. Em seguida, ele pega a URL pública e a anexa ao link do Office Online para exibir documentos no navegador.

Muitas vezes esqueço de limpar o diretório ~ / Dropbox / Public depois de abrir no Office Online. O comando a seguir funciona do terminal para limpar esse diretório, mas não consegui incorporá-lo com êxito ao meu script. (Eu tentei adicioná-lo ao final dele e tentei outras idéias.) O comando abaixo exclui todos os arquivos no diretório ~ / Dropbox / Public, mas um. Qualquer ajuda ou sugestão é muito apreciada.

sleep 60
rm /home/brock/Dropbox/Public/!(My-Document.docx) 

Outra possibilidade (consulte o script para referência de variável). Este eu suponho que excluiria apenas o arquivo copiado.

sleep 60
rm /home/brock/Dropbox/Public/$Filename
    
por jbrock 22.09.2015 / 04:34

1 resposta

2

Sequências sem aspas (como * , ??? , a?c , abc ) são interpretadas por bash como padrões de globbing e são expandidas para a lista de nomes de arquivos que correspondem ao padrão de globbing na corrente diretório de trabalho;

Dessa perspectiva, uma sequência não numerada que não contém curingas (como abc ) ainda é interpretada como um padrão de globbing que corresponde apenas a um nome de arquivo, como abc ;

Globbing básico executa, e. a expansão de * para qualquer número de qualquer caractere e a expansão de ? para um único caractere;

No entanto, negar um padrão de globbing é parte dos recursos de globbing estendido de bash ;

Assim, para expandir !(<globbing_pattern>) , a globalização estendida deve estar ativada na atual bash instance;

A globalização estendida é ativada por padrão quando bash é chamado interativamente:

user@user-X550CL:~/tmp$ tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh

0 directories, 4 files
user@user-X550CL:~/tmp$ shopt extglob
extglob         on
user@user-X550CL:~/tmp$ rm !(script.sh)
user@user-X550CL:~/tmp$ tree -a
.
'-- script.sh

0 directories, 1 file

No entanto, o recurso de globbing estendido não é ativado por padrão quando bash é chamado de não interativamente (por exemplo, quando chamado para executar um script):

user@user-X550CL ~/tmp % tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh

0 directories, 4 files
user@user-X550CL ~/tmp % cat script.sh
#!/bin/bash
shopt extglob
rm ~/tmp/!(script.sh)
exit 0
user@user-X550CL ~/tmp % bash script.sh
extglob         off
script.sh: line 3: syntax error near unexpected token '('
script.sh: line 3: 'rm ~/tmp/!(script.sh)'
user@user-X550CL ~/tmp % tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh

0 directories, 4 files

Portanto, a solução é simplesmente ativar a globalização estendida no script usando o shopt builtin: shopt -s extglob ;

user@user-X550CL ~/tmp % tree -a
.
|-- 1
|-- 2
|-- 3
'-- script.sh

0 directories, 4 files
user@user-X550CL ~/tmp % cat script.sh
#!/bin/bash
shopt -s extglob
shopt extglob
rm ~/tmp/!(script.sh)
exit 0
user@user-X550CL ~/tmp % bash script.sh
extglob         on
user@user-X550CL ~/tmp % tree -a
.
'-- script.sh

0 directories, 1 file
    
por kos 22.09.2015 / 05:05