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
- 使用捕获变量,比如,1、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文件里对应的值了,是不是超级方便呢~~ 我们知道有时候公司返回的数据有时候都是长长的字母标识,甚至有的还无规律,导致我们得一个个手动重命名,有了这个工具只需要准备一个文件输入一行代码就可轻松搞定,可大大提高我们的工作效率~~ 赶紧体验下吧!