【问题标题】:bulk file renaming in bash, to remove name with spaces, leaving trailing digits在 bash 中重命名批量文件,以删除带有空格的名称,留下尾随数字
【发布时间】:2015-12-26 06:27:49
【问题描述】:

bash/shell 专家可以帮助我吗?每次我使用 PDF 将大的 pdf 文件(比如它的名字是 X.pdf)拆分成单独的页面时,每页都是一个 pdf 文件,它会创建具有这种模式的文件

"X 1.pdf"
"X 2.pdf"
"X 3.pdf"  etc...

上面的文件名“X”是原始文件名,可以是任何东西。然后在名称后添加一个空格,然后是页码。页码总是从 1 开始,一直到多少页。 adobe PDF 中没有选项可以更改此设置。

我需要运行一个 shell 命令来简单地删除/剥离所有“X”部分,然后只留下数字,像这样

1.pdf
2.pdf
3.pdf 
....
100.pdf  ...etc..

不擅长模式匹配,不知道需要什么正则表达式。

我知道我需要类似的东西

for i in *.pdf; do mv "$i$"  ........;  done

这是.......部分我不知道该怎么做。

这只需要在 Linux/Unix 系统上运行。

【问题讨论】:

    标签: regex bash shell


    【解决方案1】:

    使用 sed..

    for i in *.pdf; do mv "$i" $(sed 's/.*[[:blank:]]//' <<< "$i");  done
    

    通过rename 会很简单

    rename 's/.*\s//' *.pdf
    

    【讨论】:

    • 不幸的是,rename 实用程序有多种风格,例如util-linux 附带的那个根本不能那样工作。您需要名为“perl rename”的重命名才能正常工作。
    【解决方案2】:

    您可以使用 remove 直到(包括)变量中最后一个空格的所有内容:

    ${i##* }
    

    这是双散列之后的“星号空间”,意思是“后面跟着空格的任何内容”。 ${i#* } 最多删除第一个空格。

    所以运行这个来检查:

    for i in *.pdf; do echo mv -i -- "$i" "${i##* }" ; done
    

    如果看起来不错,请删除echoGordon Davisson 建议的 -i 将在覆盖之前提示您,-- 表示选项结束,如果您的文件名以 - 开头,这可以防止事情发生爆炸。

    【讨论】:

    • 我总是推荐使用 mv -i 来处理这类事情——如果移动文件会覆盖另一个文件(即你转换的最后一组 PDF),它会警告你,而不是盲目地覆盖它。
    【解决方案3】:

    如果您只想批量重命名文件(或目录)并且不介意使用外部工具,那么这里是我的:rnm

    执行您想要的操作的命令是:

    rnm -rs '/.*\s//' *.pdf
    

    .*\s 选择最后一个空格之前(和之后)的部分并将其替换为空字符串。

    注意:

    1. 它不会覆盖任何现有文件(如果找到具有目标名称的现有文件,则会引发警告)。

    2. 而且此操作是故障安全的。您可以使用rnm -u 取回上次rnm 命令所做的更改。

    3. Here's a list of documents for rnm.

    【讨论】:

      猜你喜欢
      • 2013-12-09
      • 2020-08-09
      • 1970-01-01
      • 2020-10-08
      • 2014-12-07
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多