正規表現を使用したLinuxでのファイル名の変更


9

一貫して名前を変更したいファイルのグループがあり、ファイルには次のような名前が付けられています

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

そして私はそれらを小文字、yyyymmdd、.log拡張子として欲しかった

"system.20090101.log"
"something.20090101.log"

回答:


14

renameコマンドを発見するまで、私はこれを行うためにperlスクリプトを作成していました。

名前の変更を行うためにperl正規表現を受け入れます。

このため、2つのコマンドを入力しました。

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

ただし、一部のディストリビューションでは、renameこの機能がなく(そのmanページを参照)、perl-renameまたはをインストールする必要がありprenameます。


非常に良い答え
Judiooの2009年

8
注意してください、いくつかのディストリビューションは価値のない名前変更コマンドを出荷しています。あなたのディストリビューションが最初に持っているものをチェックしてください。
derobert 2009年

私は知っていたmmvが、結局のところrename、正規表現の力を使用できるおかげで
Ludovic Kuty 14年

5
これはArch Linuxではですperl-rename
Oleh Prypin 2014年

6

名前変更コマンドがないので、これに依存しています。

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done


5

renameutilはあまり「標準」ではありません。各ディストリビューションには異なるrenameツールが付属しています。たとえば、ここのGentooではrenamesys-apps/util-linuxパッケージからのものであり、正規表現をサポートしていません。

Hamish Downerさんが提案しmmvました。特にスクリプト内で使用するのに便利なようです。

一方、一般的なケースでは、renameutilsが必要になる場合があります。これにはコマンドqmvqcpコマンドがあり、選択したテキストエディター(私の好み:Vim)が開き、そこで宛先ファイル名を編集できます。エディターを保存して閉じた後、qmv/ qcpはすべての名前変更を行います。

mmvqmvはどちらも、ファイルの名前を正しい順序で変更し、循環的な名前変更を検出するのに十分なほどスマートで、必要に応じて一時ファイルを自動的に作成します。


Gentoo sys-apps/renameでは、パッケージをemergeすることもできます。これにより、renamexm正規表現の名前変更だけでなく、大文字と小文字の大文字やその他の素晴らしいこともできます。
radicand 2013年

1

公平であるために:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

この出力を与えます:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

だが:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

正しい出力を与えます:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

{-n}スイッチを{-v}に置き換える


1

これを行うための小さなbashスクリプトを作成しました。

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

一般に、ls出力を解析することは最良のアイデアではありません。ランダム検索により、Unixでこの長い読み取りが発生しましたあなたの娯楽のためのSE。| また、あなたの答えは、より良いとの質問にマッチしますtr '[:upper:]' '[:lower:]'
HBruijn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.