2023/04/13 ツイート追加
brenameはWindows、Mac OS X、Linuxをサポートする正規表現に対応したファイルのリネームツール。再帰的に複数の階層のファイルとディレクトリ(フォルダ)を同時にリネームしたり、一連のファイルを整数の通し番号にリネームすることもできる。安全にリネームを実行するために、上書き防止の警告やドライラン機能、実行内容の取り消し機能などを備えている。人気のツールとなっており、2015年にv1.0が公開後、2022年11月現在では200近いstarがついている。
Windows file systems, e.g., NTFS and FAT, are case-insensitive. Some rename operations are allowed on Linux, while they are dangerous on Windows. E.g., renaming a.tar.gz to a.tar will overwrite A.tar. brename v2.13.0 can handle these cases appropriately. https://t.co/I5e6DwX8fO
— Wei Shen 沈伟 (@shenwei356) April 13, 2023
Batch renaming files are dangerous! https://t.co/mtkRMeFIIx
— Wei Shen 沈伟 (@shenwei356) October 19, 2022
I'd like to recommend `brename` again, please let your colleagues and students know before losing sequencing data. https://t.co/6RW4qqRF4E
Try brename (safely batch renaming files/directories via regular expression), which
— Wei Shen 沈伟 (@shenwei356) May 10, 2022
1) supports dry run,
2) detects potential overwriting conflicts, and
3) can undo the last operation. https://t.co/TgLgSSJKUd https://t.co/6RW4qqRF4E
特徴。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や他のパッケージマネージャでのインストールもサポートされている。
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レベルを設定する-vに2をつけるとエラーのみ標準出力される。まずドライランする。
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