微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash:在子文件夹中删除具有给定模式的文件的 IF 条件

如何解决bash:在子文件夹中删除具有给定模式的文件的 IF 条件

作为我的 bash 例程的一部分,我正在尝试添加 IF 条件,该条件应删除名称中包含模式“filt”的所有 csv 填充:

# this is a folder contained all subfolders
results=./results
# looping all directories located in the $results
for d in "${results}"/*/; do
  if [ -f "${d}"/*filt*.csv ]; check if csv file is present within dir $d
   rm "${d}"/*filt*.csv # remove this csv file
  fi
done

虽然没有条件的版本可以正确找到并删除 csv:

rm "${d}"/*filt*.csv

使用 IF 执行我的示例时出现以下错误

line 27: [: too many arguments

其中第 27 行对应于 IF 条件。如何修复?

我可以在没有任何 IF 语句的情况下使用类似的东西吗?

# find all CSV filles matching pattern within the "${d}"
find "${d}" -type f -iname *filt*.csv* -delete

解决方法

您可以使用 shopt -s nullglob,然后跳过测试并直接使用 rm -f "$d"/*filt*.csvnullglob 选项确保不匹配任何内容的 glob 扩展为空字符串,而 -f 将使 rm 静音。

您也可以跳过外循环并简化所有内容

shopt -s nullglob
rm -f results/*filt*.csv

如果 glob 匹配的文件太多以至于超过了最大行长度,这个 可能就会失败。在这种情况下,您最好使用 find:

find results -name '*filt*.csv' -exec rm {} +

或者,使用 GNU find

find results -name '*filt*.csv' -delete

如果有要跳过的子目录,请使用 -maxdepth 1。如果存在与模式匹配的目录,请使用 -type f

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。