查找 exec 并从文件名中删除扩展名

Jim*_*mes 5 bash find

知道为什么这个命令不起作用吗?顺便说一句,我正在尝试删除当前目录中所有 csv 文件的扩展名。

find -type f -iname "*.csv" -exec mv {} $(basename {} ".csv") \;
Run Code Online (Sandbox Code Playgroud)

尝试了许多变体,包括参数扩展、xargs ...即使如此,一切都徒劳无功。

hol*_*ill 10

这应该做:

 find ./ -type f -iname "*.csv" -exec sh -c 'mv {} $(basename {} .csv)' \;
Run Code Online (Sandbox Code Playgroud)

find能够{}用它的结果替换,因为引号阻止执行子 shell,直到find完成。然后它执行该-exec部分。


你的问题为什么不工作是$(basename {} ".csv")在子shell(-> $())中执行并预先评估的。如果我们逐步查看命令执行,您将看到会发生什么:

  1. find -type f -iname "*.csv" -exec mv {} $(basename {} ".csv") \;- 你的命令
  2. find -type f -iname "*.csv" -exec mv {} {} \;- subshel​​l 被评估($(basename {} ".csv")返回,{}因为它解释{}为文字)
  3. find -type f -iname "*.csv" -exec mv {} {} \;- 正如你现在所看到的:移动实际上没有任何作用