1. ホーム
  2. bash

[解決済み] sed を使ってファイルの名前を大量に変更する

2022-11-11 15:03:06

質問

目的

これらのファイル名を変更する。

  • F00001-0708-RG-biasliuyda
  • F00001-0708-CS-akgdlaul
  • F00001-0708-VF-hioulgigl

をこれらのファイル名に変換します。

  • F0001-0708-RG-biasliuyda
  • F0001-0708-CS-akgdlaul
  • F0001-0708-VF-hioulgigl

シェルコード

テストするために

ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/'

実行するために

ls F00001-0708-*|sed 's/\(.\).\(.*\)/mv & \1\2/' | sh

私の質問

sedのコードがよくわかりません。 私は何を理解している置換 コマンドを使います。

$ sed 's/something/mv'

を意味します。 そして、正規表現はなんとなく理解しています。 しかし、私は ここで何が起こっているのか理解できない。

\(.\).\(.*\)

またはここで

& \1\2/

前者は、私には「一文字」という意味にしか見えません。 1 文字が続き、その後に任意の長さの 1 文字のシーケンスが続く。 という意味にしか見えませんが、きっとそれ以上の意味があるのでしょう。 しかし、それだけではありません。 後者の部分に関しては

& \1\2/

全く分からない。

どのように解決するのですか?

まず最初に、最も簡単な方法は prename または rename コマンドを使用することです。

Ubuntu では、OSX (Homebrew パッケージの rename , MacPorts パッケージ p5-file-rename ) や、Perl の rename (prename)がある他のシステムで使用できます。

rename s/0000/000/ F0000*

またはRHELのようなutil-linux-ngからリネームされたシステム上では。

rename 0000 000 F0000*

同等のsedコマンドよりずっと分かりやすいですね。

でも、sedコマンドの理解に関しては、sedのmanpageが参考になります。もし man sed を実行して & を検索してください (検索には / コマンドを使用します)。 を検索すると、それがs/foo/bar/の置換における特殊文字であることがわかります。

  s/regexp/replacement/
         Attempt  to match regexp against the pattern space.  If success‐
         ful,  replace  that  portion  matched  with  replacement.    The
         replacement may contain the special character & to refer to that
         portion of the pattern space  which  matched,  and  the  special
         escapes  \1  through  \9  to refer to the corresponding matching
         sub-expressions in the regexp.

したがって \(.\) で参照できる最初の文字にマッチします。 \1 . 次に . は次の文字にマッチし、それは常に 0 です。 次に \(.*\) で参照できるファイル名の残りの部分にマッチします。 \2 .

置換文字列は & (元の ファイル名) と \1\2 は、ファイル名の2文字目(0)を除くすべての部分です。 を除いた部分です。

これは、IMHOでは、かなり不可解な方法です。 もし、何らかの理由で 何らかの理由で rename コマンドが使用できず、sed を使用して名前を変更したい場合 を使用したい場合 (または、rename では複雑すぎることを行っている場合)、正規表現をより明確にすることで、rename を実行することができます。 をするのであれば、正規表現をもっと明確にした方が読みやすくなります。 より読みやすくなります。 おそらく次のようなものです。

ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh

で実際に何が変更されているのかを確認できることで、より読みやすくなります。 s/search/replacement/で実際に何が変化しているかを見ることができることで、より読みやすくなります。また また、誤って2回実行した場合、ファイル名から文字を吸い出し続けることもありません。 を2回実行したりしても、ファイル名から文字を吸い出し続けることはありません。