我有这个脚本
#!/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
.
我该如何修改?
Way*_*Yux 16
您可以在basename
此处使用该命令:
touch "$folder/$(basename "$filePng" .png).txt"
Run Code Online (Sandbox Code Playgroud)
注意额外的$folder/
. 这是必要的,因为 basename 命令从中删除了路径。
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)
如果你有很多文件要创建,一次“接触”多个文件是值得的,这样你就不需要为每个文件创建一个新进程(如果执行多个文件,这需要相当长的时间)千次)。
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)