美文网首页Linux与生物信息
Brename - 一个便捷跨平台批重命名文件/目录的命令行小工

Brename - 一个便捷跨平台批重命名文件/目录的命令行小工

作者: 凯凯何_Boy | 来源:发表于2020-10-13 21:56 被阅读0次

    brename是用Go编程语言实现的,支持跨平台Linxu和Windows用户使用。Github地址

    有以下几大特色:

    • 跨平台,支持WIndows,Mac OS X 和Linux
    • 安全 (通过检测潜在的冲突和错误)
    • 支持撤销
    • 可以检测到覆盖,用户可以选择是覆盖还是不覆盖。
    • 文件筛选,支持通过正则表达式来包括和排除文件。不需要去跑类似find ./ -name "*.html" -exec CMD这样的命令
    • 通过键值对文件来重命名匹配
    • 通过升序整数重命名。
    • 递归地重命名文件和目录。
    • 支持演练模式
    • 带有色彩输出结果

    安装

    i

    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
    
    1. (-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
    
    1. (-u/--undo):撤销上次成功的操作
     $ brename -u
     [INFO] rename back: 'b.jpg' -> 'b.jpeg'
     [INFO] rename back: 'a.jpg' -> 'a.jpeg'
     [INFO] 2 path(s) renamed
    
    1. (-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
    
    1. (-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. 使用捕获变量,比如,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
    
    1. (-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
    
    1. (-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)应该是正则表达式,不是通配符!!

    1. (-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
    
    1. -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
    
    1. (-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'
    
    1. 自动创建目录
     $ 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
    

    真实数据举例

    1. 假设我们目录下方有这么些个fasta数据文件,还有一个barcode.tsv文件。
     $ tree
     .
     ├── barcodes.tsv
     ├── tag_ATGCGTA.fasta
     ├── tag_CCCCCCC.fasta
     ├── tag_CGACGTC.fasta
     ├── tag_TCATAGC.fasta
     └── tag_TCTATAG.fasta
    
    1. 目录下的barcode.tsv文件是一个制表符分割的有着对应关系的文件,注意CCCCCCC不在其中。
     $ cat barcodes.tsv
     CGACGTC S1
     ATGCGTA S2
     TCTATAG S4
     TCATAGC S3
    
    1. 现在开始重命名这些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文件里对应的值了,是不是超级方便呢~~ 我们知道有时候公司返回的数据有时候都是长长的字母标识,甚至有的还无规律,导致我们得一个个手动重命名,有了这个工具只需要准备一个文件输入一行代码就可轻松搞定,可大大提高我们的工作效率~~ 赶紧体验下吧!

    相关文章

      网友评论

        本文标题:Brename - 一个便捷跨平台批重命名文件/目录的命令行小工

        本文链接:https://www.haomeiwen.com/subject/suvisktx.html