it-swarm-ja.tech

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

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

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

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

"system.20090101.log"
"something.20090101.log"
9
Osama ALASSIRY

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をインストールする必要がある場合があります。

14
Osama ALASSIRY

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

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

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

Hamish Downermmvを提案しました。これは、特にスクリプト内で使用する場合に便利です。

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

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

4

mmv は、複数のファイルを移動/名前変更する標準のLinuxユーティリティです。ほとんどのディストリビューションのリポジトリから入手できます。上記の例では、次のことができます。

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

詳細については、この debadayの記事 または man page を参照してください。

4
Hamish Downer

公平であるために:

_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
fpba

これを行うための小さな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
1
bjarkig82