在扩展名之前向文件名添加文本

Sam*_*007 35 bash filenames rename

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

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
Run Code Online (Sandbox Code Playgroud)

我希望它是,

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
Run Code Online (Sandbox Code Playgroud)

jw0*_*013 37

使用标准 POSIX 参数扩展

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done
Run Code Online (Sandbox Code Playgroud)

  • 那么重命名文件的命令将是这样的:`for f in *.shp; 执行 mv $f ${f%.shp}_poly.shp; 完成` (3认同)
  • 如果能解释一下它是如何工作的可能会更好。另一方面,道格的答案非常简单。 (2认同)

Cha*_*ark 8

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

rename 's/\.shp$/_poly.shp/' *shp
Run Code Online (Sandbox Code Playgroud)

它可能不便携,但很容易使用。


ccp*_*zza 7

由于问题是bash不需要外部实用程序,因为您可以使用bash 正则表达式

\n
for f in *.shp\ndo\n    mv -v "${f}" "${f%.*}_MYSUFFIX.${f##*.}"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n
\n

\xe2\x9d\x97\xef\xb8\x8f警告for f in *.ext可靠,因为它会破坏包含空格、引号或其他保留字符的文件名。一种故障安全方法是使用类似find . -iname \'*.shp\' -exec sh -c \'mv -v "${1}" "${1%.*}_MYSUFFIX.${f##*.}"\' _ {} \\;. 如果不需要递归遍历则添加-maxdepth 1

\n
\n


don*_*l24 5

用这个:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done
Run Code Online (Sandbox Code Playgroud)

  • 使用 `basename` 比让 shell 自己完成工作更慢,效率也更低。对于非常大量的文件,这可能会很明显。 (4认同)