rm 如果存在具有相同基名的文件

mre*_*req 3 bash rm filename

假设我有以下文件:

foo.coffee
foo.js
bar.js
Run Code Online (Sandbox Code Playgroud)

rm *.js如果有相应的.coffee文件,是否有一种简单的方法?在示例中,这样的命令将删除foo.js离开:

foo.coffee
bar.js
Run Code Online (Sandbox Code Playgroud)

我正在寻找某种rm包装,因为我需要执行递归rm -r.

gni*_*urf 5

一点点(使用所有最佳实践!):

shopt -s nullglob

for f in *.js; do
    coffee=${f%.js}.coffee
    [[ -f $coffee ]] && rm -v -- "$f"
done
Run Code Online (Sandbox Code Playgroud)
  • nullglobshell 可选行为,因此*.js如果没有扩展名为js.
  • 使用shell 参数扩展删除扩展名.js.coffee在变量中替换它coffee
  • rm-v开关(详细)一起使用,以便您了解正在发生的事情。
  • rm也用于--标记选项的结束,以防万一有一个以连字符开头的文件:在这种情况下,rm会混淆并尝试解释选项。
  • [[ ... ]]构造是条件构造并使用条件表达式。请注意,我使用的是强大的双方括号 [[而不是单个[. 非常好的实践(在)。
  • 请注意,引用是完美的。对于名称中包含空格或有趣符号的文件,它是 100% 安全的。

出于测试目的,你应该把echo在眼前rm

    [[ -f $coffee ]] && echo rm -v -- "$f"
Run Code Online (Sandbox Code Playgroud)

以便它只回显命令而不删除任何内容。如果您对此感到满意,请删除echo.

享受!

  • 我希望我可以为传播 Bash 最佳实践再提供一个 +1。关于 `[` 与 `[[`,另见 [BashGuide/TestsAndConditionals](http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29)。 (2认同)