Удалите все файлы, но один в каталоге после запущения скрипта

Я использую этот сценарий для открытия документов Microsoft Office в Office Онлайн, чтобы преобразовать их в PDF (для моей работы) и сохранить форматирование. Сценарий для просмотра офисных документов в Microsoft Office Онлайн

Сценарий в основном копирует docx файл в мой ~/Dropbox/Public каталог. Затем это захватывает общедоступный URL и добавляет, это к Office Онлайн связывается для просмотра документов в браузере.

Я часто забываю убирать ~/Dropbox/Public каталог после открытия в Office Онлайн. Следующая команда работает от терминала для убирания этого каталога, но я не мог включить его успешно в мой сценарий. (Я попытался добавить его в конец его и попробовал другие идеи.) Команда ниже удаляет все файлы в ~/Dropbox/Public каталог, но один. Любая справка или предложения очень ценятся.

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

Другая возможность (см. сценарий для ссылки на переменную). Этот, которого я принимаю, удалил бы только скопированный файл.

sleep 60
rm /home/brock/Dropbox/Public/$Filename
1
задан 13 April 2017 в 15:23

1 ответ

Неупомянутые строки (такой как *, ???, a?c, abc) интерпретируются bash как globbing шаблоны, и они расширены до списка имен файлов, соответствующих globbing шаблону в текущем рабочем каталоге;

С этой точки зрения, неупомянутая строка, не содержащая подстановочные знаки (такой как abc) все еще интерпретируется как globbing сопоставление с образцом только имя файла такой как abc;

Основной globbing работает, например, расширение * к любому количеству любого символа и расширению ? к отдельному символу;

Однако отрицание globbing шаблона является частью расширенных globbing функций bash;

Таким образом для расширения !(<globbing_pattern>), расширенный globbing должен быть включен в токе bash экземпляр;

Расширенный globbing включен по умолчанию когда bash назван в интерактивном режиме:

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

Однако расширенный globbing не включен по умолчанию когда bash назван нев интерактивном режиме (например, при вызове для запущения скрипта):

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

Таким образом, решение состоит в том, чтобы просто включить расширенный globbing в сценарии с помощью shopt встроенный: 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
2
ответ дан 7 December 2019 в 13:53

Другие вопросы по тегам:

Похожие вопросы: