mv 没有那个文件或目录?重命名多个目录中的文件

0 shell-script rename mv

这部分是因为我对 BASH 的理解非常浅薄。

这是脚本:

eighteen=(2018*/*)
newe=`echo "$eighteen" | sed -e 's/\(-\)*$//g'`

while read f <&3 && read nf <&4; do     
    mv -v "${f}" "${nf}"
    break
done 3<"$eighteen" 4<"$newe"
Run Code Online (Sandbox Code Playgroud)

我试图弥补我写的糟糕脚本,并删除-多个子文件夹中每个文件名末尾的符号。

和我得到的错误: ./cleanup.sh: line 16: 2018-08-13/untitled-102.arw: No such file or directory

值得注意的是,错误不是来自mv行,而是来自:done 3<"$eighteen" 4<"$newe"

我从 StackExchange 上的答案中复制了 while 循环。速食,通常是不利于消化的,速食之道——理解,请帮我理解。给我一个关于如何4<"$newe" nf <&4调用前面提到的替换的提示,我应该如何搜索以了解更多信息。它是否应用于while语句上下文之外?

Gil*_*not 5

您似乎使用了一个简单的错误 shell 脚本,您可以在其中使用适当的工具,并保留您的正则表达式:

rename -n 's/-*$//' 2018*/*
Run Code Online (Sandbox Code Playgroud)

-n当输出看起来不错时删除开关以真正重命名。

男人重命名

警告 还有其他同名的工具可能会也可能不会这样做,所以要小心。

作为util-linux包一部分的重命名命令不会。

如果您运行以下命令:

$ rename
Run Code Online (Sandbox Code Playgroud)

你看perlexpr,这似乎是正确的工具 =)

如果没有,将其设为默认值(通常已经是这种情况)Debian和衍生工具,例如Ubuntu

$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename
Run Code Online (Sandbox Code Playgroud)

对于archlinux:

pacman -S perl-rename
Run Code Online (Sandbox Code Playgroud)

对于 RedHat 系列发行版:

yum install prename
Run Code Online (Sandbox Code Playgroud)

“prename”包位于EPEL存储库中。


对于 Gentoo:

emerge dev-perl/rename
Run Code Online (Sandbox Code Playgroud)

对于 *BSD:

pkg install gprename
Run Code Online (Sandbox Code Playgroud)

或者 p5-File-Rename


对于 Mac 用户:

brew install rename
Run Code Online (Sandbox Code Playgroud)

如果您在其他发行版中没有此命令,请搜索您的包管理器以安装它或手动执行(没有 deps ...)


这个工具最初是由 Perl 的父亲 Larry Wall 编写的。