複数のファイル名の変更、一部の文字列の変更[重複]

複数のファイル名の変更、一部の文字列の変更[重複]

image(1) image(2) image(3) と似た名前のファイルがたくさんあります。 image1.jpg image2.jpgなどの名前を変更したいです。中かっこでは2つのステップで実行できます。これは明らかに、その行に対して組み込まれたシェル提供の文字列置換関数のようです。

orig="a_string"
mod=${orig/string/new_thing}

a_stringをa_new_thingに変換します。したがって、forループでこれを使用すると、)を.jpgに変換できます。

for f in *; do mv $f "${f/)/.jpg}" ;done

それから

for f in *; do mv $f "${f/\(/}" ;done

(を削除してください。開く括弧はエスケープする必要があります。そうしないと、シェルはそれが別のものの始まりだと思います。閉じ括弧はこのようにエスケープする必要はありません。良い方法はパイプを使用するのと同じです.

答え1

コマンドを使用して複数のファイルの名前を変更できますrename。この場合、考えられる解決策は次のとおりです。

rename 's/\(//; s/\)/.jpeg/;' image*

答え2

デュアルスラッシュを使用すると、複数の項目を一度に変更できます。

for f in * ; do mv "$f" "${f//[()]/}.jpg" ; done

答え3

複数の置換を実行する方法に関する一般的な質問を扱います(特に名前の変更では、これは他の状況に適用される可能性があります)。名前に「over」と「dog」という単語を含むファイルが複数あり、それらをそれぞれ「under」と「cat」に置き換えたいとします。

無差別代入:

for f in *
do
    g=${f/over/under}
    h=${g/dog/cat}
    mv -- "$f" "$h"
done

(これにより、--ファイル名が次に始まり、発生する可能性がある望ましくない動作からユーザーを保護できます。-mv -- "$f" "$h".jpg必要に応じて最後の行をに変更します。 )ファイル名にただ「超過」または 「dog」(両方ではない)の場合は、1つだけを置き換えることができます。 「dog」と「over」(順番に)が含まれている場合は、まだ交換を行います。ポーズを取る場合、文字列は「(」と「)」であり、おそらくその動作は気に入らないでしょう。

ポリスチレンmv実際には、次のようにコマンドを保護する必要があります。

if [ "$f" != "$h" ]
それから
    if [-e "$h"]
    それから
        (エラー処理)
    その他
        mv——"$f" "$h"
    フィリピン諸島
完璧

ファイル名を自分の名前に変更しようとしたときにエラーメッセージが表示されないようにするには(名前には次のものが含まれていないため)誰でも文字列)と既存のファイルの破損を防ぎます(例:ファイルがあり、すでにimage(1)ファイルがある場合image1.jpg)。

そしてsed

for f in *
do
    g=$(sed 's/\(.*\)over\(.*\)dog\(.*\)/\1under\2cat\3/' <<< "$f")
    mv -- "$f" "$g"
done

これは最初のものとは反対です。 「超過」する場合のみ交換してください。そして「犬」両方(順番に)表示され、それ以外の場合は表示されません。

("here string") 構文は<<<すべてのシェルでは機能しません。この文字列をサポートしていないシェルで上記の操作を実行するには、次のようにします。

for f in *
do
    g=$(printf "%s" "$f" | sed 's/\(.*\)over\(.*\)dog\(.*\)/\1under\2cat\3/')
    mv -- "$f" "$g"
done

関連情報