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

おすすめ記事