[解決済み] sed を使ってファイルの名前を大量に変更する
質問
目的
これらのファイル名を変更する。
- 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回実行したりしても、ファイル名から文字を吸い出し続けることはありません。
関連
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] sedで改行をスペースに置き換えるには?
-
[解決済み] Pythonを使ってファイル名を変更する方法
-
[解決済み] 大量のファイルの拡張子を変更するにはどうすればよいですか?
-
[解決済み] Sed を使って文字列を含む行全体を置換する
-
[解決済み】bash/sedスクリプトを使用してテキストファイルの最初の行を削除するにはどうすればよいですか?
-
[解決済み] IFS=$' \n' の正確な意味は何ですか?
-
[解決済み] シェルスクリプトで文字列が空でもスペースでもないことをチェックする
-
[解決済み] Bashのコマンドラインと入力制限
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Bashでファイルを転置する効率的な方法
-
[解決済み] スクリプトの実行に関連したファイルの参照
-
[解決済み] 実行中のBASHスクリプトのパスを決定する [重複].
-
[解決済み] 複数のbashスクリプトにまたがってpushd/popdのスタックを表示しない (quiet pushd/popd)
-
[解決済み] bashのcurlステートメントに'&'文字を含める方法
-
[解決済み] すべてのファイルに再帰的にファイル拡張子を追加する
-
[解決済み] homebrew パッケージがインストールされているかどうかを検出する
-
[解決済み] MacOSXでZSHをデフォルトシェルにする [終了しました]。
-
[解決済み] bashでファイル(引数)を編集しているコマンドを "その場 "で実行するには?
-
[解決済み] 最終編集日順のファイル一覧