一部のファイルの名前を変更しています。
これは働きます:
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
プレビューから実際の名前変更に変更されたフラグが削除されました。