运行脚本后删除目录中除一个文件之外的所有文件

运行脚本后删除目录中除一个文件之外的所有文件

我使用此脚本在 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?cabc)被解释为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

因此解决方案很简单,使用内置命令在脚本中启用扩展通配符shoptshopt -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

相关内容