一个unix命令中有多个unix全局变量

一个unix命令中有多个unix全局变量,unix,glob,Unix,Glob,假设我在一个文件夹中有3个文本文件,one.txt,two.txt,和three.txt。我想把它们全部改成降价文件。愚蠢的方式是 mv one.txt one.md mv two.txt two.md mv three.txt three.md 我希望这样做的方式类似于mv*.txt*.md,但这不起作用。很明显,glob(*)的工作方式与我认为的不同。所以我想我想做的是 mv*.txt捕获\u GLOB\u ITERANT.md 感谢您的帮助 shell不会以允许您执行所需操作的方式捕获模

假设我在一个文件夹中有3个文本文件,
one.txt
two.txt
,和
three.txt
。我想把它们全部改成降价文件。愚蠢的方式是

mv one.txt one.md
mv two.txt two.md
mv three.txt three.md
我希望这样做的方式类似于
mv*.txt*.md
,但这不起作用。很明显,glob(
*
)的工作方式与我认为的不同。所以我想我想做的是

mv*.txt捕获\u GLOB\u ITERANT.md


感谢您的帮助

shell不会以允许您执行所需操作的方式捕获模式,而
mv
本身也不会这样做。因此,使用
mv
您仍然需要一个循环:

for f in *.txt; do mv -- "$f" "${f%.txt}.md"; done
如果您想用一个命令来实现这一点,则需要一个专门的实用程序,例如
rename

rename 's/\.txt\z/.md/' *.txt

这不是一个真正的编程问题。在运行
mv
之前,shell将您的命令扩展为
mv one.txt three.txt two.txt*.md
*.md
保持未扩展状态,因为没有与此模式匹配的文件)。常见的实用程序包括
rename
(好的,用Perl编写)、
rename
(linux util中糟糕的一个),还有可能是
mmv
。那应该是
s/\.txt\z/.md/
是正则表达式元字符,需要转义
\z
在字符串末尾匹配(
$
在字符串末尾匹配,但在字符串末尾之前的换行符也匹配)。啊,是的,知道dot,而不是
\z
,谢谢。也发现了,所以。。。无论如何,这个问题可能已经解决了。这个答案还告诉我,为了安全起见,我应该使用
mv--
,以破折号开头的文件名。。。