フォルダ内のすべてのPNGのtxtファイルを作成したい


12

私はこのスクリプトを持っています

#!/bin/bash

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

for filePng in $folder/*
do
touch $filePng.txt
done

動作しますが001.png、という名前のファイルに対して、の001.png.txt代わりに作成します001.txt

これを変更するにはどうすればよいですか?


4
変数を引用するのは良い習慣です。シェルスクリプトは、最初から完全に設計されているのではなく、時間の経過とともに進化した奇妙な言語です。変数を引用しないと、変数の内容に含まれる空白やアスタリスクは、奇妙な方法で物事を壊します。スクリプトをより堅牢にするために、変数の使用は常に二重引用符で囲みます。ここでは、あなたが言うfor filePng in "$folder"/*touch "$filePng".txt -が付け加えたときにのみ、それらを引用注意してください$
ミューザー

3
これはXYの問題のように見えます…なぜこれをやろうとしているのですか?
-JeromeJ

回答:


16

basenameここでコマンドを使用できます。

touch "$folder/$(basename "$filePng" .png).txt"

追加に注意してください$folder/。basenameコマンドがパスを削除するため、これが必要です。


パラメーターの拡張とコマンドの置換を引用したことをお勧めしますか?
トムフェネク

@TomFenechええ、おそらく文字列全体を引用することをお勧めします。回答を編集しました。
Wayne_Yux

内側の引用符を削除した理由がわかりません$filePng-それらも有用でした。
トムフェネク

1
いいえ、$( )新しい引用コンテキストを確立するからです。
トムフェネク

2
ああ、あなたは正しい-今日何か新しいことを学んだ
;

31

シェルのパラメーター拡張機能を使用して、既存の拡張機能を削除できます

${parameter%pattern}「パターン」は「パラメーター」の末尾と照合されます。結果は、最短一致が削除された「パラメータ」の拡張値です。

だからあなたの場合には、交換する$filePng.txt"${filePng%.png}.txt"


10

スチールドライバーが既に言及しているもの-パラメーターの拡張-のバリエーションにより、文字列置換を使用してジョブを実行できます。さらに、変数を引用する必要があります。以下は編集したスクリプトです。

#!/bin/bash

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

for filePng in "$folder"/*
do
    touch "${filePng/.png/.txt}"
done

9

作成するファイルがたくさんある場合、一度に複数のファイルを「タッチ」する価値があります。そのため、各ファイルに新しいプロセスをフォークする必要はありません(複数実行する場合はかなり時間がかかります)千回)。

オプション1:パターン置換+ xargs

このオプションは、touchコマンドへの複数のパス、通常は数千またはシステムが単一のコマンドラインに適合するものを一度に提供します。

find "$folder" -mindepth 1 -maxdepth 1 -name '*.png' -print0 |
sed -ze 's/\.png$/.txt/' |
xargs -r0 -- touch --

オプション2:パラメーター拡張+コマンド出力のリダイレクト

このオプションはまったく実行さtouchれませんが、サブプロセスをまったく必要としないBash / Bourne / POSIXシェル機能を代わりに使用します。

for f in "$folder"/*.png; do
    : >> "${f%.png}.txt"
done

4

.png名前の途中にファイルがないと確信している場合は、パラメーターを拡張した配列を使用できます。

pngs=( /path/to/pngs/*.png )
touch "${pngs[@]/.png/.txt}"

これ.pngは、配列で終わるファイルへのすべてのパスを格納し、パラメーターの展開を使用して、それぞれに.txt置き換え.pngてファイルのリストを作成します.txt

同じ呼び出しの引数としてすべてを渡すことができないほど多くのファイルがある場合、これは壊れることに注意してくださいtouch

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.