回答:
basename
ここでコマンドを使用できます。
touch "$folder/$(basename "$filePng" .png).txt"
追加に注意してください$folder/
。basenameコマンドがパスを削除するため、これが必要です。
$filePng
-それらも有用でした。
$( )
新しい引用コンテキストを確立するからです。
スチールドライバーが既に言及しているもの-パラメーターの拡張-のバリエーションにより、文字列置換を使用してジョブを実行できます。さらに、変数を引用する必要があります。以下は編集したスクリプトです。
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in "$folder"/*
do
touch "${filePng/.png/.txt}"
done
作成するファイルがたくさんある場合、一度に複数のファイルを「タッチ」する価値があります。そのため、各ファイルに新しいプロセスをフォークする必要はありません(複数実行する場合はかなり時間がかかります)千回)。
xargs
このオプションは、touch
コマンドへの複数のパス、通常は数千またはシステムが単一のコマンドラインに適合するものを一度に提供します。
find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --
このオプションはまったく実行さtouch
れませんが、サブプロセスをまったく必要としないBash / Bourne / POSIXシェル機能を代わりに使用します。
for f in "$folder"/*.png; do
: >> "${f%.png}.txt"
done
for filePng in "$folder"/*
とtouch "$filePng".txt
-が付け加えたときにのみ、それらを引用注意してください$
。