这部分是因为我对 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"
我试图弥补我编写的糟糕脚本,并删除-
多个子文件夹中每个文件名末尾的符号。
和我得到的错误:./cleanup.sh: line 16: 2018-08-13/untitled-102.arw: No such file or directory
值得注意的是,该错误不是来自mv
line,而是来自 this: done 3<"$eighteen" 4<"$newe"
。
我从 StackExchange 上的答案中复制了 while 循环。快餐通常不利于消化,快速解决方案-为了理解,请帮助我理解。请给我一个关于如何调用前面提到的替换的提示4<"$newe"
nf <&4
,我应该如何搜索以了解更多信息。它是否应用于while
语句上下文之外?
答案1
您似乎使用了一个简单的有缺陷的 shell 脚本,您可以在其中使用适当的工具,保留您的正则表达式:
rename -n 's/-*$//' 2018*/*
-n
当输出看起来不错才能真正重命名时,请删除开关。
还有其他同名的工具可能能够也可能无法做到这一点,所以要小心。
作为包一部分的重命名命令util-linux
不会。
如果您运行以下命令:
$ rename
你看perlexpr
,那么这似乎是正确的工具 =)
如果不是,则将其设为默认值(通常已经是这种情况)Debian
并衍生如下Ubuntu
:
$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename
对于 archlinux:
pacman -S perl-rename
对于 RedHat 系列发行版:
yum install prename
'prename' 包位于EPEL存储库。
对于 Gentoo:
emerge dev-perl/rename
对于 *BSD:
pkg install gprename
或者p5-File-Rename
对于 Mac 用户:
brew install rename
如果您的其他发行版没有此命令,请搜索您的软件包管理器来安装它或手动做(没有部门...)
这个工具最初是由 Perl 之父 Larry Wall 编写的。