在扩展名之前将文本添加到文件名


25

我想在文件名的末尾但在扩展名前添加文本。现在我正在尝试,

for f in *.shp; do echo $f_poly; done

输出是

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

我希望如此

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

Answers:


27

使用标准POSIX参数扩展

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

太棒了,这正是我所需要的。
Sam007

1
解释一下它如何工作可能会更好。另一方面,道格的答案很简单。
Sarge Borsch 2015年

@SargeBorsch您需要解释什么?我的答案,问题的摘要和道格的答案仅相差几个字符,道格的答案甚至比我的解释少,所以我不知道您想要什么。如果仅比较问题中两个输出的差异,那么找出它们的作用应该很容易。我可以解释为什么我的答案比道格的答案更好。1.我使用printf的是格式字符串,而不是不太便携的echo。2. basename对于这样一个简单的任务,我使用参数扩展比调用外部二进制()更有效。
jw013 2015年

然后,重命名文件的命令将是:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

有时会安装一个名为“重命名”的工具。

rename 's/\.shp$/_poly.shp/' *shp

它可能不是便携式的,但易于使用。


1
这是唯一为我工作的人,很好的答案!
wanderer0810

4

用这个:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
使用这种basename方法比让Shell自己完成工作要慢且效率低。对于大量文件,这可能会很明显。
2012年

此外,缺少引号和--s,对于在.shp。之前带有换行符的文件名,它将失败。
斯特凡Chazelas

感谢您给出的答案,我实际上可以为我的目的而合作。这是bash帮助,而不是编码golf。(读完这本书。我意识到这听起来好像我在讽刺。与您相比,这里的其他答案更令人困扰。再次感谢)
蒂姆·

3

这对我来说更好:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


好吧,这看起来很像被接受的答案,只是您可能想要for f in *.webm,忘记了引号,${f}而您却错过了--
斯特凡Chazelas

1
接受的答案在OSX上不起作用,它仅打印出新文件名,实际上并没有重命名文件
Vinnie James

1
当然,它向您展示了如何使用shell扩展来获取新的文件名,以回答同样会输出文件名(带有echo)但不是必需文件名的问题。
斯特凡Chazelas


1

因为问题是bash因为您可以使用bash regexps,所以不需要外部实用程序:

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.