由于我对Bash缺乏了解,我带着一个微不足道的问题来找你。我有一个'应用程序' 41个文件夹的目录。在每个文件夹中,都有一个包含glue1.css文件的css
子目录。我的目标是通过bash循环删除该css文件,但我需要免除两个文件夹:ad
和glue-resources
。
我需要免除ad
文件夹,因为没有css文件。我想防止执行时发生以下错误:
rm: ad/css/glue1.css: No such file or directory
考虑这个假设目录(为简洁起见,缺少41个文件夹):
Apps
ad
css
(empty)
glue-resources
css
glue1.css (keep this file!)
profile
css
glue1.css (remove this file!)
...
这是我到目前为止的代码。如果父目录路径不等于rm
或glue-resources/css/
,它应该在glue1.css文件上调用ad/css/
。
for dir in **/css/; do
if [[ "${dir}" != 'glue-resources/css/' || "${dir}" != 'ad/css/' ]]; then
rm "${dir}"glue1.css
fi
done
以上代码结果不起作用。我得到同样的#39;没有这样的文件或目录'错误和glue-resources/css
中的glue1.css文件已被删除。我不太清楚为什么它不起作用 - 我在某处读到,如果你使用[[
和]]
,你可以结合多个条件。
我认为问题在于我不了解bash中的多个条件是如何工作的。以下版本的代码可以使用。
for dir in **/css/; do
if [[ "${dir}" != 'glue-resources/css/' ]]; then
rm "${dir}"glue1.css
fi
done
for dir in **/css/; do
if [[ "${dir}" != 'ad/css/' ]]; then
rm "${dir}"glue1.css
fi
done
我尝试向if语句添加多个条件失败。
答案 0 :(得分:2)
因为||
表示逻辑或,所以以下条件将始终返回true:
[[ "${dir}" != 'glue-resources/css/' || "${dir}" != 'ad/css/' ]]
我怀疑你想要的是:
[[ "${dir}" != 'glue-resources/css/' && "${dir}" != 'ad/css/' ]]
&&
是逻辑AND。它要求同时满足这两个条件。
答案 1 :(得分:0)
也许你可以避免循环并做这样的事情:
find . -path ./glue-resources -prune -o -name glue1.css | xargs -I [] rm []