【问题标题】:Why does ''rm "$dir"/* !(.gitignore)'' delete the script itself?为什么 ''rm "$dir"/* !(.gitignore)'' 会删除脚本本身?
【发布时间】:2019-09-12 03:55:41
【问题描述】:

我有一个用来清理一些临时文件的 shell 脚本。 该脚本存储在:/root/cronjobs。 当我从这个位置 ./cleanUploader.sh 运行脚本时,它会删除当前文件夹中的所有文件及其自身。 这是脚本:

#!/bin/bash

# cleanUploader.sh
# Batch file to remove various temp directories and files left over from the Uploader

clear
echo 

INHOUSEFILES=/var/www/html/inhouseweb/officedb/uploader/files

shopt -s extglob
if [ -d $INHOUSEFILES ]; then
    echo "Removing directory $INHOUSEFILES"
    rm -rf $INHOUSEFILES/* !(".gitignore")
else
    echo "directory $INHOUSEFILES not found"
fi
echo

shopt -u extglob

echo
echo "Done"

我做错了什么?

【问题讨论】:

  • 请注意,您确实应该引用[ -d "$INHOUSEFILES" ]。 (理想情况下,不要给它一个全大写的名称;那些由 s​​hell 和 POSIX 定义的工具用于环境和改变其操作的内置变量,而具有至少一个小写字符的名称保证不会修改 POSIX - 定义工具在应用程序使用时的行为——请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 的相关标准,记住设置 shell 变量会覆盖任何类似命名的环境变量。

标签: bash shell sh


【解决方案1】:
rm -rf $INHOUSEFILES/* !(".gitignore")

这会删除$INHOUSEFILES/* 中的所有文件,然后 删除当前 目录中除.gitignore 之外的所有文件。这就是 !(".gitignore") 在单独参数时所做的事情。

如果您的意图是删除 $INHOUSEFILES/ 中除 .gitignore 之外的所有内容,则将两个参数结合起来:

rm -rf $INHOUSEFILES/!(".gitignore")

引用变量扩展也是一个好主意。 (相反,您不需要它们围绕像 .gitignore 这样的文字字符串。)

rm -rf "$INHOUSEFILES"/!(.gitignore)

【讨论】:

  • 如果没有dotglob.gitinore 文件不会被删除吗?
  • 对,* 默认不匹配隐藏文件。也许OP想要删除除.gitignore之外的隐藏文件?我不知道,取决于他们。
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2015-06-21
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多