想要为文件夹中的每个 png 创建 txt 文件

想要为文件夹中的每个 png 创建 txt 文件

我有这个脚本

#!/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,那么这将会中断。

相关内容