![运行脚本后删除目录中除一个文件之外的所有文件](https://linux22.com/image/1052488/%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E5%90%8E%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95%E4%B8%AD%E9%99%A4%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
我使用此脚本在 Office Online 中打开 Microsoft Office 文档,将其转换为 PDF(用于我的工作)并保留格式。 用于在 Microsoft Office Online 中查看办公文档的脚本
该脚本基本上将 docx 文件复制到我的 ~/Dropbox/Public 目录。然后它获取公共 URL 并将其附加到 Office Online 链接以在浏览器中查看文档。
在 Office Online 中打开后,我经常忘记清除 ~/Dropbox/Public 目录。以下命令可从终端清除此目录,但我无法将其成功合并到我的脚本中。(我尝试将其添加到末尾,并尝试了其他想法。)以下命令删除 ~/Dropbox/Public 目录中除一个文件之外的所有文件。任何帮助或建议都非常感谢。
sleep 60
rm /home/brock/Dropbox/Public/!(My-Document.docx)
还有一种可能性(请参阅脚本中的变量引用)。我假设这个只会删除复制的文件。
sleep 60
rm /home/brock/Dropbox/Public/$Filename
答案1
未加引号的字符串(例如*
,???
,a?c
,abc
)被解释为bash
通配符模式,并扩展为当前工作目录中与通配符模式匹配的文件名列表;
从这个角度来看,不包含通配符的未加引号的字符串(例如abc
)仍被解释为仅匹配文件名的通配符模式,例如abc
;
基本通配符执行例如将 扩展*
为任意数量的任意字符以及将 扩展?
为单个字符;
然而,否定通配符模式是 的扩展通配符功能的一部分bash
;
因此,为了扩展!(<globbing_pattern>)
,必须在当前实例中启用扩展通配符bash
;
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
然而扩展的通配符不是以非交互方式调用时默认启用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
因此解决方案很简单,使用内置命令在脚本中启用扩展通配符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