文字または文字列を削除して複数のファイルの名前を変更するにはどうすればよいですか?


21

以前の質問へのフォローアップとして、フォームのファイルが複数ある場合

sw.ras.001
sw.ras.002
sw.ras.003
…

ras.すべてのファイルの途中で削除するには、どのコマンドを使用できますか?


削除するかだけras、すなわちで終わるsw..001、またはras.、残しsw.001
ケビン

おそらく「ras。」を削除したいと思います。コマンドは非常に異なるでしょうか?
ポール

いいえ、\.パターンに含めるかどうかだけです。
ケビン

回答:


35

これは、最後の質問のいずれかの回答をかなり小さな修正で行うことができます。

rename s/ras\.// sw.ras.*

または

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

説明:

renameは、正規表現とファイルのリストperlを受け取り、perl各ファイルの名前に正規表現を順番に適用し、各ファイルの名前を正規表現の適用結果に変更するスクリプトです。私たちの場合、rasはに一致し\.、リテラルに一致し..単独で改行以外の文字を示します)、それを何も置き換えません。

forループは、すべてで始まるファイル取りsw.ras.、その上(標準シェルのglob)とループを。${var/search/replace}検索$varsearchと置き換えで最初に出現するreplaceので、${file/ras./}戻って$file最初とras.削除。したがって、コマンドはファイルの名前をマイナスの同じ名前に変更しますras.。この検索と置換で.は、特殊文字としてではなく、文字通りに解釈されることに注意してください。


学習している他の人への答えを説明していただけますか?「s / ras \ .// sw.ras。*」とは何ですか?私はそれを知っていると思いますが、私は確信したい、そして他の人も学ぶことができます。2番目のオプションも同じです。
H_7

1
@ H_7良いアイデア、説明を追加しました。
ケビン

14

別のオプションは、mmv(Mass MoVeおよび名前変更)を使用することです:

mmv '*ras.*' '#1#2'

パターンを単一引用符で囲むことを忘れないでください。そうしないと、星がシェルレベルで展開されます。

このユーティリティは常に使用できるとは限りませんが、使用できない場合は、次の方法でインストールできます。

sudo apt-get install mmv

こちらのmanページをご覧ください


1
それは素晴らしいツールです!!!
クリスチャン

5

すべてのPOSIX準拠のシェルで(bashdashksh、など):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

またはrename

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

私は最近、ファイル名で複数回出現した文字の最後の出現を置き換える必要がある多くのファイルの一括名前変更を行う必要がありました。この特定のケースでは、最後のダッシュ-をアンダースコアに置き換えなければなりませんでした_

some-long-file-name.ext

これに:

some-long-file_name.ext

少し時間がかかりましたが、これでようやくできました。

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

ここに:

  • ${i%-*} ファイル名の先頭から最後にダッシュが現れるまで一致します -
  • ${file##*-} ダッシュが最後に出現した後のファイル名の残りに一致します -
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.