macでインフォマティクス

macでインフォマティクス

HTS (NGS) 関連のインフォマティクス情報についてまとめています。

ファイルを安全にリネームする brenameコマンド

2023/04/13 ツイート追加

 

brenameはWindowsMac OS XLinuxをサポートする正規表現に対応したファイルのリネームツール。再帰的に複数の階層のファイルとディレクトリ(フォルダ)を同時にリネームしたり、一連のファイルを整数の通し番号にリネームすることもできる。安全にリネームを実行するために、上書き防止の警告やドライラン機能、実行内容の取り消し機能などを備えている。人気のツールとなっており、2015年にv1.0が公開後、2022年11月現在では200近いstarがついている。

 

 

特徴。Gihtubより

  • Cross-platform. Supporting Windows, Mac OS X and Linux.
  • Safe. By checking potential conflicts and errors.
  • Supporting Undo the LAST successful operation.
  • Overwrite can be detected and users can choose whether overwrite or leave it.
  • File filtering. Supporting including and excluding files via regular expression. No
  • need to run commands like find ./ -name "*.html" -exec CMD.
  • Renaming submatch with corresponding value via key-value file.
  • Renaming via ascending integer.
  • Recursively renaming both files and directories.
  • Supporting dry run.
  • Colorful output. Screenshots:

 

インストール

arm向け実行形式ファイルをダウンロードしてテストした。go getや他のパッケージマネージャでのインストールもサポートされている。

Github

go get -u github.com/shenwei356/brename/

> brename -h

$ brename -h

 

brename -- a practical cross-platform command-line tool for safely batch renaming files/directories via regular expression

 

Version: 2.11.1

 

Author: Wei Shen <shenwei356@gmail.com>

 

Homepage: https://github.com/shenwei356/brename

 

Attention:

  1. Paths starting with "." are ignored.

  2. Flag -f/--include-filters and -F/--exclude-filters support multiple values,

     e.g., -f ".html" -f ".htm".

     But ATTENTION: comma in filter is treated as separator of multiple filters.

 

Special replacement symbols:

 

  {nr}    Ascending integer

  {kv}    Corresponding value of the key (captured variable $n) by key-value file,

          n can be specified by flag -I/--key-capt-idx (default: 1)

 

Usage:

  brename [flags] [path ...] 

 

Examples:

  1. dry run and showing potential dangerous operations

      brename -p "abc" -d

  2. dry run and only show operations that will cause error

      brename -p "abc" -d -v 2

  3. only renaming specific paths via include filters

      brename -p ":" -r "-" -f ".htm$" -f ".html$"

  4. renaming all .jpeg files to .jpg in all subdirectories

      brename -p "\.jpeg" -r ".jpg" -R   dir

  5. using capture variables, e.g., $1, $2 ...

      brename -p "(a)" -r "\$1\$1"

      or brename -p "(a)" -r '$1$1' in Linux/Mac OS X

  6. renaming directory too

      brename -p ":" -r "-" -R -D   pdf-dirs

  7. using key-value file

      brename -p "(.+)" -r "{kv}" -k kv.tsv

  8. do not touch file extension

      brename -p ".+" -r "{nr}" -f .mkv -f .mp4 -e

  9. only list paths that match pattern (-l)

      brename -i -f '.docx?$' -p . -R -l

  10. undo the LAST successful operation

      brename -u

 

  More examples: https://github.com/shenwei356/brename

 

Flags:

  -d, --dry-run                   print rename operations but do not run

  -F, --exclude-filters strings   exclude file filter(s) (regular expression, NOT wildcard). multiple values supported, e.g., -F ".html" -F ".htm", but ATTENTION: comma in filter is treated as separator of multiple filters

  -U, --force-undo                continue undo even when some operations failed

  -h, --help                      help for brename

  -i, --ignore-case               ignore case of -p/--pattern, -f/--include-filters and -F/--exclude-filters

  -e, --ignore-ext                ignore file extension. i.e., replacement does not change file extension

  -f, --include-filters strings   include file filter(s) (regular expression, NOT wildcard). multiple values supported, e.g., -f ".html" -f ".htm", but ATTENTION: comma in filter is treated as separator of multiple filters (default [.])

  -D, --including-dir             rename directories

  -K, --keep-key                  keep the key as value when no value found for the key

  -I, --key-capt-idx int          capture variable index of key (1-based) (default 1)

  -m, --key-miss-repl string      replacement for key with no corresponding value

  -k, --kv-file string            tab-delimited key-value file for replacing key with value when using "{kv}" in -r (--replacement)

  -l, --list                      only list paths that match pattern

  -a, --list-abs                  list absolute path, using along with -l/--list

  -s, --list-sep string           separator for list of found paths (default "\n")

      --max-depth int             maximum depth for recursive search (0 for no limit)

  -N, --nature-sort               list paths in nature sort, using along with -l/--list

      --nr-width int              minimum width for {nr} in flag -r/--replacement. e.g., formating "1" to "001" by --nr-width 3 (default 1)

      --only-dir                  only rename directories

  -o, --overwrite-mode int        overwrite mode (0 for reporting error, 1 for overwrite, 2 for not renaming) (default 0)

  -p, --pattern string            search pattern (regular expression)

  -q, --quiet                     be quiet, do not show information and warning

  -R, --recursive                 rename recursively

  -r, --replacement string        replacement. capture variables supported.  e.g. $1 represents the first submatch. ATTENTION: for *nix OS, use SINGLE quote NOT double quotes or use the \ escape character. Ascending integer is also supported by "{nr}"

  -n, --start-num int             starting number when using {nr} in replacement (default 1)

  -u, --undo                      undo the LAST successful operation

  -v, --verbose int               verbose level (0 for all, 1 for warning and error, 2 for only error) (default 0)

  -V, --version                   print version information and check for update

 

 

実行方法

動作確認のためのテストデータ生成スクリプト; generate-example-folder.shが用意されている(touchコマンドで空のファイルを作り、treeコマンド(apt install tree)でディレクトリ構造を表示するスクリプト)。

git clone https://github.com/shenwei356/brename.git
cd brename/
sh generate-example-folder.sh

 

このテストデータディレクトリに対して、".jpeg"拡張子のファイルを".jpg"拡張子に変更するという処理を行う。brenameでは-pオプションで検索パターンを指定する。.jpegを探したいので"\.jpeg"とする(特殊文字ピリオド"."はバックスラッシュでエスケープする)。-rで置換後のパターンを指定する。-Rをつけてサブディレクトリまで対象とする(つけないとカレントディレクトリのファイルのみ対象)。最初は-dをつけてdryランして想定した通りのリネーム処理が行われるのかどうかを確認する。

#-dを付けるとドラインラン
brename -p "\.jpeg" -r ".jpg" -R -d
  • -d, --dry-run    print rename operations but do not run
  • -R, --recursive    rename recursively
  • -r, --replacement <string>     replacement. capture variables supported.  e.g. $1 represents the first submatch. ATTENTION: for *nix OS, use SINGLE quote NOT double quotes or use the \ escape character. Ascending integer is also supported by "{nr}"
  • -p, --pattern <string>     search pattern (regular expression)

ドライランでは標準出力に結果がプレビューされるが実際にはリネーム処理は実行されていない。


問題なければ-dを外して実行する。

brename -p "\.jpeg" -r ".jpg" -R

>  tree example/

 

-uだけつけてbrenameを実行すると、直前のリネーム処理をundo(リネーム前に戻る)できる。

brename -u
  • -u, --undo    undo the LAST successful operation

 

次はexampleファイルの”a"を"b"に変えるリネーム処理を考える。ディレクトリも対象にするには-Dをつける。verboseレベルを設定する-v2をつけるとエラーのみ標準出力される。まずドライランする。

brename -p a -r b -R -D -v 0 -d
  • -D, --including-dir    rename directories
  • -v, --verbose <int>   verbose level (0 for all, 1 for warning and error, 2 for only error) (default 0)

[INFO] main options:

[INFO]   ignore case: false

[INFO]   search pattern: a

[INFO]   include filters: .

[INFO]   search paths: ./

[INFO] 

[INFO] checking: [ ok ] 'a.html' -> 'b.html'

[ERRO] checking: [ new path existed ] 'a.jpeg' -> 'b.jpeg'

[ERRO] 1 potential error(s) detected, please check

a.jpegをb.jpegにリネームするリムームでエラーが検出された。理由は既にこのパスにb.jpegが存在し、元のb.jpegが消えることになるため。このように、breseqではエラーが検出された時、リネーム処理は全てのファイルにおいて実行されない。この機能により、意図しないファイルの損失や置換を防いでくれる。

 

大文字小文字の区別をせずにパターンマッチさせるなら"-i"をつける。

brename -p "\.jpeg" -r ".jpg" -R -i
  • -i, --ignore-case    ignore case of -p/--pattern, -f/--include-filters and -F/--exclude-filters

 

拡張子は対象外にするなら-eをつける。

brename -p '(.)' -r '$1 ' -d -e
  • -e, --ignore-ext     ignore file extension. i.e., replacement does not change file extension

 

変数をキャプチャして利用することで、より高度なリネームを行う。変数にキャプチャするにはパターンマッチさせる文字を()で囲む。

"abのパターンマッチをaaに変える。aは$1、bは$2に収納されるので$1$1ならabはaaに変わる。
brename -p "(a)(b)" -r "\$1\$1" -i -d

#任意の一文字にマッチさせるなら"."を使う。
"abとそれに続く一文字が".JPEG"の前にあるファイルをbb.jpgに変える。aは$1、bは$2、任意の一文字は$3に収納されるので、$2$2ならabはbbに変わる。
brename -p "(a)(b)(.).JPEG" -r "\$2\$2.jpg" -i -d

 

"-f"で追加のパターンマッチフィルターを設定することで、マッチするファイルを限定できる。正規表現に対応している。"-F"ではマッチするファイル以外が対象になる。正規表現に対応しているが、危険なワイルドカードには対応していない。

#任意の一文字の後にスペースを入れる。ただし、リネーム対象は末尾($)が.jpgのファイルに限定する。
brename -p '(.)' -r '$1 ' -f '\.jpg$' -d
  • -f, --include-filters <strings>    include file filter(s) (regular expression, NOT wildcard). multiple values supported, e.g., -f ".html" -f ".htm", but ATTENTION: comma in filter is treated as separator of multiple filters (default [.])
  • -F, --exclude-filters s<trings>    exclude file filter(s) (regular expression, NOT wildcard). multiple values supported, e.g., -F ".html" -F ".htm", but ATTENTION: comma in filter is treated as separator of multiple filters

 

カレントディレクトリにある.jpgで終わる全てのファイルをprefixがpic-で始まる通し番号に変換する。番号の間隔やフォーマットは"--nr-width"で変えることができる。初期値は"--start-num"で変えることができる。

brename -p '(.+)\.' -r 'pic-{nr}.' -f ".jpg$" -d
  • --nr-width <int>     minimum width for {nr} in flag -r/--replacement. e.g., formating "1" to "001" by --nr-width 3 (default 1)
  • -n, --start-num <int>     starting number when using {nr} in replacement (default 1)

 

パターンマッチを利用して自動でサブディレクトリに振り分ける機能も用意されている(自動でディレクトリが作られる)。下では、ハイフン(-)でカテゴリが分けられた一連のファイルを-を区切りとして分割する。例えばa-b-c.txtというファイルが存在すれば、a/b/の中にc.txtにリネームして配置される。

brename -f .txt -p '-' -r '/' -d

 

他にもいくつかの機能が用意されています。レポジトリを確認してください。

 

2022/11/29

refseqのfastaファイルおよそ40万個をリネームする処理を実行したところ、数十秒で終わりました。

引用

https://github.com/shenwei356/brename