这有效:
$ touch abcdefg
$ mv -v abcdefg abc[de]fg
‘abcdefg’ -> ‘abc[de]fg’
但这不起作用:
$ touch abcdefg
$ mv -v abcdefg abc[d]efg
mv: ‘abcdefg’ and ‘abcdefg’ are the same file
为什么?
答案1
shell 将根据文件名扩展模式。
第一种形式扩展为(no e) 和/或(no d) 并且两个文件都不存在,因此该模式保持未扩展状态,并且命令就是您认为的那样;有效地,
abcdfg
abcefg
mv -v "abcdefg" "abc[de]fg"
第二种形式扩展为
abcdefg
,并且该文件存在,因此该模式扩展为文件名,因此该命令实际上是:mv -v abcdefg abcdefg
尝试此操作以查看何时保留或扩展模式。
touch abcdefg
ls -l abc[de]fg ; echo abc[de]fg
ls -l abc??fg ; echo abc??fg
ls -l abc?fg ; echo abc?fg
ls -l abc[d]efg ; echo abc[d]efg