Bash 为什么'';rm"$dir";/*!(.gitignore)和#x27';是否删除脚本本身?
我用这个shell脚本清理一些临时文件。 脚本存储在:/root/cronjobs中。 当我从这个位置运行脚本时,/cleanUploader.sh,它会删除当前文件夹中的所有文件及其自身。 以下是脚本:Bash 为什么'';rm"$dir";/*!(.gitignore)和#x27';是否删除脚本本身?,bash,shell,sh,Bash,Shell,Sh,我用这个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=/v
#!/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"
我做错了什么
rm -rf $INHOUSEFILES/* !(".gitignore")
这会删除$INHOUSEFILES/*
中的所有文件,然后还会删除当前目录中除.gitignore
之外的所有文件。这就是!(“.gitignore”)
作为单独的参数时执行
如果您打算删除$INHOUSEFILES/
中除.gitignore
之外的所有内容,请将这两个参数组合起来:
rm -rf $INHOUSEFILES/!(".gitignore")
引用变量展开式也是一个好主意。(相反,您不需要将它们放在像.gitignore
这样的文本字符串周围)
如果没有
dotglob
的话,.gitinore
文件不会被删除吗?是的,*
默认情况下与隐藏文件不匹配。也许OP想要删除.gitignore
之外的隐藏文件?我不知道,由他们决定。请注意,您确实应该引用[-d“$INHOUSEFILES”]
。(理想情况下,不要给它一个全大写的名称;这些名称由shell和POSIX定义的工具用于环境和内置变量,这些工具会更改它们的操作,而至少有一个小写字符的名称保证在应用程序使用时不会修改POSIX定义的工具的行为——请参阅相关标准at,保留在m中)指定shell变量的设置覆盖任何类似命名的环境变量)。
rm -rf "$INHOUSEFILES"/!(.gitignore)