【发布时间】:2019-04-24 16:03:57
【问题描述】:
我试图在一堆文件的文件名前添加一个字符串。我阅读了几个问题,他们都为基本相同的命令推荐了不同的语法,只有一个有效。
我使用cmder 作为我的控制台。我试图将 crypto- 添加到 CWD 中的所有文件中,这就是我尝试过的:
This answer 推荐如下语法:
for i in *.png ; do mv "$i" "crypto-$i" ; done
此时我出乎意料。
This answer 推荐双百分号%%i:
for %%i in *.png ; do mv "$i" "crypto-$i" ; done
%%i 出乎意料。
This answer 建议 i 使用单个百分号而不是美元符号:
for %i in *.png ; do mv "$i" "crypto-$i" ; done
*.png 在此时出乎意料。
这次我走得更远,注意到在答案中,文件名用括号括起来,所以我尝试了:
for %i in (*.png) ; do mv "$i" "crypto-$i" ; done
mv "$i" "crypto-$i" ;完成
mv: 目标“完成”不是目录
然后我想该命令也应该放在括号中:
for %i in (*.png) ; do (mv "$i" "crypto-$i") ; done
此时完成是出乎意料的。
在那之后,我决定不使用;:
for %i in (*.png) do (mv "$i" "crypto-$i")
(mv "$i" "crypto-$i" )
mv: cannot stat '$i': 没有这样的文件或目录
最后,我想既然我第一次用%来指代i,我应该稍后再用%并尝试:
for %i in (*.png) do (mv "%i" "crypto-%i")
此变体有效,所有文件都已成功重命名。
我的问题是 - 为什么最后一个命令有效而其他命令无效?为什么有这么多不同的语法似乎只在某些情况下有效?那些场合是什么?为什么有时加括号有时不加括号?为什么有时加分号有时不加分号? $i、%i和%%i有什么区别?
【问题讨论】:
-
您指的答案似乎是关于 Bash,而您似乎没有使用 Bash。
-
其中几个(
%i、%%i、(*.png))根本不与/for/relevant-to POSIX 兼容的 shell。您将 Windows cmd.exe 语法与 UNIX-shell 语法混合在一起。 -
请务必检查问题标记。除非添加了更具体的标签,否则仅标记为
shell的问题应该与 POSIX 系列 shell 有关。有关 Windows cmd.exe 的问题应标记为cmd。您不能期望将标记为cmd或batch的问题的答案应用于任何 UNIX-y shell。 -
cmder 只是一个控制台/终端模拟器。你需要知道里面运行的是什么。
-
ls和mv不是 bash 命令,它们是程序。显然你已经安装了这些的 Windows 版本。 “shell 或 bash”是什么意思? Bash 是一个外壳。
标签: shell command-line cmder