【问题标题】:Files not renaming with rename command不使用重命名命令重命名文件
【发布时间】:2016-05-29 18:47:48
【问题描述】:

我的当前工作目录中有 3 个文件,如下所示:

abc def xyz.tgz
ghi jkl xyz.tgz
def klm zxc.tgz

我希望重命名文件,以便将空格替换为下划线。为此,我使用了以下方法:

rename -v 's/\ /_/g' *tgz

以下是问题:

  1. 命令执行没有任何错误,但没有重命名文件。
  2. 当目录只包含一个tgz文件时,会出现如下错误:

    rename: not enough arguments
    
  3. 如果我使用以下内容:

    rename " " "_" *.tgz
    

    只有一次出现的空格被下划线替换。

【问题讨论】:

  • 你的 rename 是 perl rename 还是 util-linux rename 还是别的什么?貌似是util-linuxrename(man7.org/linux/man-pages/man1/rename.1.html),不支持s/.../.../
  • ls -l $(which rename)
  • 没有 bash rename 命令。这是一个外部命令,不是 shell 的一部分,不应标记为“bash”。
  • 为什么不用 mv 命令?

标签: shell unix rename


【解决方案1】:

您的系统似乎提供了另一个rename,它不支持Perl 的替换。你仍然可以使用它:

while ls *' '*tgz &> /dev/null ; do
    rename ' ' _  *' '*tgz || break
done

或者只是使用 mv 和参数扩展:

for file in *' '*tgz ; do
    mv "$file" "${file// /_}"
done

【讨论】:

  • 嗯。第一个公式循环让我觉得有点危险。如果rename 失败并以非零状态退出而不重命名任何文件怎么办?至少应该在上面放一个|| break,以防止在错误情况下出现无限循环。
【解决方案2】:

此代码将查找当前目录中的所有文件或目录,并将其文件名中的所有空格替换为下划线:

find . -name '* *' -exec bash -c 'mv -v "$0" "`echo $0 | tr " " "_"`"' {} \;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 2018-04-14
    • 2015-06-05
    • 2021-06-04
    • 1970-01-01
    • 2015-07-19
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多