Bash批量删除指定文件问题求助
Bash批量删除指定文件问题求助
嗨,这位新手朋友!我来帮你搞定这个批量删文件的小问题~
首先你碰到的核心问题很明确:你给通配符*套了双引号,导致Shell不会解析它,反而把带*的字符串当成了一个完整的文件名。比如你写的rm "red_dk*",Shell会傻乎乎地去找一个名叫red_dk*的文件,而不是所有以red_dk开头的文件——说不定你之前单独执行时没加引号才成功的?
不管怎样,正确的写法是去掉包裹通配符的引号,让Shell自动展开这些匹配规则:
#!/bin/bash # 不带引号的通配符会被Shell自动解析成所有符合条件的文件名 rm red_dk* red_lt* *.gif
这样写之后,Shell会把red_dk*转换成所有以red_dk开头的文件,red_lt*转换成所有以red_lt开头的文件,*.gif转换成所有以.gif结尾的文件,rm就能准确删除这些目标文件了。
不过为了避免误删,强烈建议你先把rm换成echo预览一下要删除的文件列表,确认无误再执行删除:
echo red_dk* red_lt* *.gif
如果你的文件名里有空格、特殊字符(比如!、@这类),上面的方法可能会出问题,这时候用find命令会更稳妥:
#!/bin/bash # 先切换到目标文件夹,避免路径错误 cd apples || exit # 先预览要删除的文件,确认后把-print换成-delete即可 find . -type f \( -name "red_dk*" -o -name "red_lt*" -o -name "*.gif" \) -print
这里-type f表示只匹配文件(不包含文件夹),-o代表“或”的逻辑,用括号把条件括起来是为了保证逻辑顺序正确。
最后再啰嗦一句:批量删除操作一定要谨慎,预览是个能帮你避坑的好习惯哦~
备注:内容来源于stack exchange,提问作者denvercode
相关产品推荐
相关产品推荐

