我有这个脚本
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
它可以起作用,只是,对于名为 的文件001.png
,它会创建001.png.txt
而不是001.txt
。
我该如何修改它?
答案1
您可以使用 shell 的参数扩展特征
${parameter%pattern}
'pattern' 与 'parameter' 的末尾进行匹配。结果是删除最短匹配项后扩展的 'parameter' 值。
因此,对于你的情况,替换$filePng.txt
为"${filePng%.png}.txt"
答案2
您可以basename
在此处使用该命令:
touch "$folder/$(basename "$filePng" .png).txt"
请注意附加的$folder/
。这是必需的,因为 basename 命令会从中删除路径。
答案3
通过对steeldriver已经提到的参数扩展进行改进,我们可以使用字符串替换来完成这项工作。此外,您应该引用变量。下面是您编辑的脚本。
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in "$folder"/*
do
touch "${filePng/.png/.txt}"
done
答案4
如果您确信您没有.png
名称中间某处的文件,那么您可以使用带有参数扩展的数组:
pngs=( /path/to/pngs/*.png )
touch "${pngs[@]/.png/.txt}"
这将存储以 结尾的所有文件的路径到.png
一个数组中,然后使用参数扩展来创建文件列表.txt
,通过在每个文件上.png
替换。.txt
请记住,如果您有太多文件以至于无法将它们全部作为参数传递给同一个 调用touch
,那么这将会中断。