这部分是因为我对 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语句上下文之外?
您似乎使用了一个简单的错误 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 编写的。