gpt4 book ai didi

linux - 在 bash 中查找文件失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:12 25 4
gpt4 key购买 nike

我正在 Bash 中编写一个脚本,旨在清除目录中可能存在的所有垃圾文件。我创建了一个包含所有要删除的文件模式的数组。

例子

假设我有一个名为 temp 的目录,并且在其中我有与下面数组中的模式匹配的文件

fileJunk=(".inca*" ".cat*" "*Cat%" "*inca*")

然后我为下面的每一项执行查找

for j in "${fileJunk[@]}"
do
myList=( `find temp -maxdepth 2 -type f -iname $j` )
for z in "${myList[@]}"
do
rm $z >& /dev/null
if [ $? -eq 0 ]
then
echo -e "SUCCESS: File $j was deleted\n"
fi
done
done

问题是 find 命令找到了除 inca 应该匹配的文件之外的所有文件。

仅当我用双引号括起 *inca* 时,直接在命令行上执行此操作才有效。所以我将数组更改为:

fileJunk=(".inca*" ".cat*" "*Cat%" "\"*inca*\"")

这样我将 "*inca*" 传递给 find 命令而不是 *inca*。然而,这只适用于命令行,而不是使用脚本?

更多信息最后要弄清楚我的问题是:为什么当我在带有 "*inca*" 的 shell 中使用命令 find 时它起作用,而在脚本中不起作用不是吗?

最佳答案

在 Bash 中使用变量时,您几乎应该总是将任何变量放在双引号中。我会像这样更改您的代码:

for j in "${fileJunk[@]}"
do
myList=( $(find temp -maxdepth 2 -type f -iname "$j") )
for z in "${myList[@]}"
do
rm -f "$z" >& /dev/null
if [ $? -eq 0 ]
then
echo -e "SUCCESS: File $j was deleted\n"
fi
done
done

例如,如果我们要拉出第一个 for 循环并运行它,回显 find 命令:

$ fileJunk=(".inca*" ".cat*" "*Cat%" "*inca*")
$ for j in "${fileJunk[@]}";do echo "find temp -maxdepth 2 -type f -iname \"$j\""; done
find temp -maxdepth 2 -type f -iname ".inca*"
find temp -maxdepth 2 -type f -iname ".cat*"
find temp -maxdepth 2 -type f -iname "*Cat%"
find temp -maxdepth 2 -type f -iname "*inca*"

这些是您要在此处运行的 find 命令的形式。

调试 Bash

如果即使使用引号,您仍然遇到问题,我会启用您的脚本,使其变得冗长。您可以通过设置 set -x 来做到这一点。

例如:

$ set -x; for j in "${fileJunk[@]}";do find /tmp -maxdepth 2 -type f -iname "$j"; done; set +x
+ set -x
+ for j in '"${fileJunk[@]}"'
+ find /tmp -maxdepth 2 -type f -iname '.inca*'
+ for j in '"${fileJunk[@]}"'
+ find /tmp -maxdepth 2 -type f -iname '.cat*'
+ for j in '"${fileJunk[@]}"'
+ find /tmp -maxdepth 2 -type f -iname '*Cat%'
+ for j in '"${fileJunk[@]}"'
+ find /tmp -maxdepth 2 -type f -iname '*inca*'
+ set +x

关于linux - 在 bash 中查找文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52152089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com