brename是用Go编程语言实现的,支持跨平台Linxu和Windows用户使用。Github地址
有以下几大特色:
- 跨平台,支持WIndows,Mac OS X 和Linux
- 安全 (通过检测潜在的冲突和错误)
- 支持撤销
- 可以检测到覆盖,用户可以选择是覆盖还是不覆盖。
- 文件筛选,支持通过正则表达式来包括和排除文件。不需要去跑类似
find ./ -name "*.html" -exec CMD
这样的命令 - 通过键值对文件来重命名匹配
- 通过升序整数重命名。
- 递归地重命名文件和目录。
- 支持演练模式
- 带有色彩输出结果
安装
Linux用户
·下载安装包之后,将软件放置环境变量即可
mkdir -p $HOME/bin/; cp brename $HOME/bin/
Windows用户
根据自己的操作系统下载安装包,然后复制brename.exe 到 C:\WINDOWS\system32路径之下即可.
参数
-d, --dry-run 重命名操作但是不执行(预览)
-F, --exclude-filters strings 排除文件过滤器(正则表达式,而不是通配符)。支持多个值,例如-F”。html“- f”。但注意:过滤器中的逗号被视为多个过滤器的分隔符
-U, --force-undo 操作失败时候强制撤销
-h, --help 帮助文档
-i, --ignore-case 忽略-p/——模式,-f/——包含过滤器和-f/——排除筛选的情况
-e, --ignore-ext 忽视文件的扩展名
-f, --include-filters strings 包含文件过滤器(正则表达式,而不是通配符)。支持多个值,例如-f”。html“- f”。但注意:过滤器中的逗号被视为多个过滤器的分隔符
-D, --including-dir 重命名目录
-K, --keep-key 当对应键的值没有找到保持键作为值
-I, --key-capt-idx int 捕获键的变量索引(默认为1)
-m, --key-miss-repl string 替换没有对应值的键
-k, --kv-file string 当使用{kv}功能时候,通过制表符分割的键值对文件代替键
-l, --list 只列出匹配模式路径
-a, --list-abs 列出绝对路径,与-l/- list一起使用
-s, --list-sep string 找到的路径列表的分隔符(默认为“\n”))
--max-depth int 递归搜索目录的最大层数
-N, --nature-sort 自然排序列出路径,与-l/- list一起使用
--nr-width int 标记-r/-中{nr}的最小宽度。例如,将“1”格式化为“001”,通过——nr-width 3(默认为1)
--only-dir 只重名目录
-o, --overwrite-mode int 覆盖模式(0表示报告错误,1表示覆盖,2表示没有renaming) (default 0)
-p, --pattern string 搜索模式(匹配模式)
-q, --quiet 静默模式,不要显示信息和警告
-R, --recursive 递归重命名
-r, --replacement string 替换。获取变量的支持。例如,$1表示第一个子匹配。注意:对于*nix操作系统,使用单引号而不是双引号或使用\转义字符。“{nr}”也支持升序整数
-n, --start-num int 使用{nr}替换时的起始编号(默认为1)
-u, --undo 撤销上次操作
-v, --verbose int 详细级别(0表示所有,1表示警告和错误,2表示仅有错误)(默认为0)
-V, --version 打印版本信息检查更新
示例
我们先在目录下创建以下的文件目录作为演示, 执行完每行命令后可以看【INFO】后面的提示信息文件的变化了解各个参数的功能。
$ tree example
├── abc
│ ├── A.JPEG
│ ├── B.HTM
│ └── B.JPEG
├── a.html
├── a.jpeg
└── b.jpeg
-
(-R/--recursive)
:在所有的子目录中递归重命名所有的.jpeg
文件为jpg
。(-d/--dry--run)
: 首次运行前进行安全预览模式,不会真正的执行操作.
$ brename -p "\.jpeg" -r ".jpg" -R -d
[INFO] main options:
[INFO] ignore case: false
[INFO] search pattern: \.jpeg
[INFO] include filters: .
[INFO] search paths: ./
[INFO]
[INFO] checking: [ ok ] 'a.jpeg' -> 'a.jpg'
[INFO] checking: [ ok ] 'b.jpeg' -> 'b.jpg'
[INFO] 2 path(s) to be renamed
$ brename -p "\.jpeg" -r ".jpg" -R
[INFO] main options:
[INFO] ignore case: false
[INFO] search pattern: \.jpeg
[INFO] include filters: .
[INFO] search paths: ./
[INFO]
[INFO] checking: [ ok ] 'a.jpeg' -> 'a.jpg'
[INFO] checking: [ ok ] 'b.jpeg' -> 'b.jpg'
[INFO] 2 path(s) to be renamed
[INFO] renamed: 'a.jpeg' -> 'a.jpg'
[INFO] renamed: 'b.jpeg' -> 'b.jpg'
[INFO] 2 path(s) renamed
$ tree
.
├── abc
│ ├── A.JPEG
│ ├── B.HTM
│ └── B.JPEG
├── a.html
├── a.jpg
└── b.jpg
-
(-u/--undo)
:撤销上次成功的操作
$ brename -u
[INFO] rename back: 'b.jpg' -> 'b.jpeg'
[INFO] rename back: 'a.jpg' -> 'a.jpeg'
[INFO] 2 path(s) renamed
-
(-v/--verbose)
: 预览并且只展示造成错误的操作
# default value of -v is 0
$ brename -p a -r b -R -D -d
[INFO] checking: [ ok ] 'a.html' -> 'b.html'
[ERRO] checking: [ new path existed ] 'a.jpg' -> 'b.jpg'
[INFO] checking: [ ok ] 'abc' -> 'bbc'
[ERRO] 1 potential error(s) detected, please check
$ brename -p a -r b -R -D -d -v 2
[ERRO] checking: [ new path existed ] 'a.jpg' -> 'b.jpg'
[ERRO] 1 potential error(s) detected, please check
-
(-i/--ignore--case)
: 忽视大小写
$ brename -p "\.jpeg" -r ".jpg" -R -i
[INFO] checking: [ ok ] 'abc/A.JPEG' -> 'abc/A.jpg'
[INFO] checking: [ ok ] 'abc/B.JPEG' -> 'abc/B.jpg'
[INFO] 2 path(s) to be renamed
[INFO] renamed: 'abc/A.JPEG' -> 'abc/A.jpg'
[INFO] renamed: 'abc/B.JPEG' -> 'abc/B.jpg'
[INFO] 2 path(s) renamed
$ tree
.
├── abc
│ ├── A.jpg
│ ├── B.HTM
│ └── B.jpg
├── a.html
├── a.jpg
└── b.jpg
- 使用捕获变量,比如,2....
$ brename -p "(a)" -r "\$1\$1" -i
[INFO] checking: [ ok ] 'a.html' -> 'aa.html'
[INFO] checking: [ ok ] 'a.jpg' -> 'aa.jpg'
[INFO] 2 path(s) to be renamed
[INFO] renamed: 'a.html' -> 'aa.html'
[INFO] renamed: 'a.jpg' -> 'aa.jpg'
[INFO] 2 path(s) renamed
$ tree
.
├── aa.html
├── aa.jpg
├── abc
│ ├── A.jpg
│ ├── B.HTM
│ └── B.jpg
└── b.jpg
-
(-D/--including-dir)
:重命名目录,也可以使用(-D --only-dir)
只重命名目录
$ brename -p "a" -r "A" -R -D
[INFO] checking: [ ok ] 'aa.html' -> 'AA.html'
[INFO] checking: [ ok ] 'aa.jpg' -> 'AA.jpg'
[INFO] checking: [ ok ] 'abc' -> 'Abc'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'aa.html' -> 'AA.html'
[INFO] renamed: 'aa.jpg' -> 'AA.jpg'
[INFO] renamed: 'abc' -> 'Abc'
[INFO] 3 path(s) renamed
$ tree
.
├── AA.html
├── AA.jpg
├── Abc
│ ├── A.jpg
│ ├── B.HTM
│ └── B.jpg
└── b.jpg
-
(-f/--include-filters)
和(-F/--exclude-filters)
: 通过正则表达式只重命名特别的文件
$ brename -p '(.)' -r '$1 ' -d -f '\.jpg$' # 只重命名.jpg文件
[INFO] main options:
[INFO] ignore case: false
[INFO] search pattern: (.)
[INFO] include filters: \.jpg$
[INFO] search paths: ./
[INFO]
[INFO] checking: [ ok ] 'AA.jpg' -> 'A A . j p g '
[INFO] checking: [ ok ] 'b.jpg' -> 'b . j p g '
[INFO] 2 path(s) to be renamed
$ brename -p '(.)' -r '$1 ' -d -F '\.html$'
[INFO] checking: [ ok ] 'AA.jpg' -> 'A A . j p g '
[INFO] checking: [ ok ] 'b.jpg' -> 'b . j p g '
[INFO] 2 path(s) to be renamed
注意:(-f/--include-filters)
和(-F/--exclude-filters)
应该是正则表达式,不是通配符!!
-
(-e/--ignore-ext)
: 不改变文件的扩展名
$ brename -p '(.)' -r '$1 ' -d -e
[INFO] checking: [ ok ] 'AA.jpg' -> 'A A .jpg'
[INFO] checking: [ ok ] 'b.jpg' -> 'b .jpg'
[INFO] checking: [ ok ] 'hello AA.html' -> 'h e l l o A A .html'
[INFO] 3 path(s) to be renamed
-
-r{nr}
: 用数字重命名
$ brename -d -p '(.+)\.' -r 'pic-{nr}.' -f .jpg -d
[INFO] checking: [ ok ] 'AA.jpg' -> 'pic-1.jpg'
[INFO] checking: [ ok ] 'b.jpg' -> 'pic-2.jpg'
[INFO] 2 path(s) to be renamed
# 设置起始数字
$ brename -d -p '(.+)\.' -r 'pic-{nr}.' -f .jpg -d --nr-width 3 --start-num 11
[INFO] checking: [ ok ] 'AA.jpg' -> 'pic-011.jpg'
[INFO] checking: [ ok ] 'b.jpg' -> 'pic-012.jpg'
[INFO] 2 path(s) to be renamed
-
(-k/--kv-file)
: 通过以制表符分隔的键-值文件将子匹配替换为相应的值
$ more kv.tsv
a 一
b 二
c 三
$ brename -p '^(\w)' -r '{kv}' -k kv.tsv -K -i -d
[INFO] read key-value file: kv.tsv
[INFO] 3 pairs of key-value loaded
[INFO] checking: [ ok ] 'AA.jpg' -> '一A.jpg'
[INFO] checking: [ ok ] 'b.jpg' -> '二.jpg'
[WARN] checking: [ unchanged ] 'hello b.html' -> 'hello b.html'
[WARN] checking: [ unchanged ] 'kv.tsv' -> 'kv.tsv'
- 自动创建目录
$ brename -f .txt -p '-' -r '/'
[INFO] checking: [ ok ] 'a-b-c.txt' -> 'a/b/c.txt'
[INFO] 1 path(s) to be renamed
[INFO] renamed: 'a-b-c.txt' -> 'a/b/c.txt'
[INFO] 1 path(s) renamed
$ tree a
a
└── b
└── c.txt
真实数据举例
- 假设我们目录下方有这么些个fasta数据文件,还有一个barcode.tsv文件。
$ tree
.
├── barcodes.tsv
├── tag_ATGCGTA.fasta
├── tag_CCCCCCC.fasta
├── tag_CGACGTC.fasta
├── tag_TCATAGC.fasta
└── tag_TCTATAG.fasta
- 目录下的barcode.tsv文件是一个制表符分割的有着对应关系的文件,注意CCCCCCC不在其中。
$ cat barcodes.tsv
CGACGTC S1
ATGCGTA S2
TCTATAG S4
TCATAGC S3
- 现在开始重命名这些fasta文件,标记
unkonwn
不存在的标签。
$ brename -e -p 'tag_(\w+)' -r '{kv}' -k barcodes.tsv -m unknown -d
[INFO] read key-value file: barcodes.tsv
[INFO] 4 pairs of key-value loaded
[INFO] checking: [ ok ] 'tag_ATGCGTA.fasta' -> 'S2.fasta'
[INFO] checking: [ ok ] 'tag_CCCCCCC.fasta' -> 'unknown.fasta'
[INFO] checking: [ ok ] 'tag_CGACGTC.fasta' -> 'S1.fasta'
[INFO] checking: [ ok ] 'tag_TCATAGC.fasta' -> 'S3.fasta'
[INFO] checking: [ ok ] 'tag_TCTATAG.fasta' -> 'S4.fasta'
[INFO] 5 path(s) to be renamed
现在我们可以看到含有这些字母的fasta文件全部都替换成了barcode.tsv文件里对应的值了,是不是超级方便呢~~ 我们知道有时候公司返回的数据有时候都是长长的字母标识,甚至有的还无规律,导致我们得一个个手动重命名,有了这个工具只需要准备一个文件输入一行代码就可轻松搞定,可大大提高我们的工作效率~~ 赶紧体验下吧!