sed /PATTERN/SUB/ $VAR?

sed /PATTERN/SUB/ $VAR?

一部のファイルの名前を変更しています。

これは働きます:
ls | while IFS= read -r line; do name=$(echo $line | sed -e 's/\(.*\)/\1.jpg/') && mv $line $name; done

大丈夫です。しかし、次のようにもう少し簡潔にしたいと思います。
ls | while IFS= read -r line; do name=$(sed -e 's/\(.*\)/\1.jpg/' $line) && mv $line $name; done

後者の例と同様の様々な試みは、変数値の代わりにファイルをsedに渡します。

$lineˋˋとその両方を使用すると、$($line)ファイルの実行が試行されます。ただし、バリアントがある場合とない場合は、"$line"すべてファイルが読み込まれます。どうなりますか?これを達成するために、この変数をsedと直接使用できますか?'line'<$line

答え1

それ良い.jpg現在のディレクトリのすべてのファイル名の末尾に追加するだけです。もしそうなら、より簡単な方法があります。

for f in ./*; do
  mv -- "$f" "$f.jpg"
done

--ダッシュ()で-始まるファイル名がとして解釈されないことを確認してください。ただし、ループ内のパスを使用してmv常に先頭にパスがあることを確認するので、ここでは問題ありません。$f././*

の出力はls人の目で読むためのものであり、通常あなたのようなwhile-read-loopに転送するのには適していません。

はい、2番目の例(sed -e 's/\(.*\)/\1.jpg/' $line)はファイルの内容を読み取りますsed。そしてBashを使うとすぐにそうすることができますsed '...' <<<"$line"。この設定は、標準入力の文字列をコマンドに渡す「here-string」と呼ばれる<<<"string"Bash拡張(少なくとも、およびkshでも使用可能)です。zsh

答え2

あなたはそれを使用することができますここで文字列文法<<<:

ls | while IFS= read -r line
do
  name=$(sed 's/\(.*\)/\1.jpg/' <<< $line) && mv "$line" "$name"
done

出力を解析することls(引用符なしの変数を使用しないこと)は良い考えではありません。

ツール名rename(単にファイル名を変更することが目的の場合):

rename -n 's/$/.jpg/' *

-nプレビューから実際の名前変更に変更されたフラグが削除されました。

関連情報