想为文件夹中的每个png制作txt文件

Qub*_*bix 12 bash scripts

我有这个脚本

#!/bin/bash

folder='/home/data/mnist/training'

for filePng in $folder/*
do
touch $filePng.txt
done
Run Code Online (Sandbox Code Playgroud)

它的工作原理就是,对于名为 的文件001.png,它会创建001.png.txt而不是001.txt.

我该如何修改?

ste*_*ver 31

您可以使用 shell 的参数扩展功能删除现有扩展

${parameter%pattern}“模式”与“参数”的结尾相匹配。结果是删除最短匹配项的“参数”的扩展值。

所以在你的情况下,替换$filePng.txt"${filePng%.png}.txt"


Way*_*Yux 16

您可以在basename此处使用该命令:

touch "$folder/$(basename "$filePng" .png).txt"
Run Code Online (Sandbox Code Playgroud)

注意额外的$folder/. 这是必要的,因为 basename 命令从中删除了路径。

  • 哦,你说得对 - 今天学到了一些新东西 ;-) (2认同)

Ser*_*nyy 10

随着 steeldriver 已经提到的变化 - 参数扩展 - 我们可以使用字符串替换来完成这项工作。此外,您应该引用变量。以下是您编辑的脚本。

#!/bin/bash

folder='/home/data/mnist/training'

for filePng in "$folder"/*
do
    touch "${filePng/.png/.txt}"
done
Run Code Online (Sandbox Code Playgroud)


Dav*_*ter 9

如果你有很多文件要创建,一次“接触”多个文件是值得的,这样你就不需要为每个文件创建一个新进程(如果执行多个文件,这需要相当长的时间)千次)。

选项 1:模式替换 + xargs

此选项将一次提供touch命令的多个路径,通常是几千个或系统可以在单个命令行中容纳的任何路径。

find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --
Run Code Online (Sandbox Code Playgroud)

方案二:参数扩展+命令输出重定向

此选项根本不运行touch,而是使用 Bash/Bourne/POSIX shell 功能,而不是根本不需要子进程。

for f in "$folder"/*.png; do
    : >> "${f%.png}.txt"
done
Run Code Online (Sandbox Code Playgroud)