perl-pe操作文件名
我试图在shell中快速清理文件名(如果有必要的话,可以是zsh)。重命名文件。(为了安全起见,我使用了perl-pe操作文件名,perl,shell,Perl,Shell,我试图在shell中快速清理文件名(如果有必要的话,可以是zsh)。重命名文件。(为了安全起见,我使用了cp而不是mv) 现在,我知道有一些工具可以做这样的事情,但出于个人兴趣,我想知道我怎么能这样做。现在,我得到一个错误: cp: target `When.ogg"' is not a directory 其中'When.ogg'是文件名的最后一部分。我尝试添加引号(见上文)并转义空格,但这是我得到的结果 有什么原因不能使用s perl pmr=的输出吗;omrt作为另一个命令行工具的最终参
cp
而不是mv
)
现在,我知道有一些工具可以做这样的事情,但出于个人兴趣,我想知道我怎么能这样做。现在,我得到一个错误:
cp: target `When.ogg"' is not a directory
其中'When.ogg'是文件名的最后一部分。我尝试添加引号(见上文)并转义空格,但这是我得到的结果
有什么原因不能使用s perl pmr=的输出吗;omrt作为另一个命令行工具的最终参数?看起来正在处理的文件名中有一个空格,因此每个cp命令行的计算结果如下
cp \#nnnn When.Ogg When.ogg
当cp命令看到两个以上的参数时,最后一个参数必须是要复制到的所有文件的目标目录名,因此会显示错误消息。因为源文件名($f
)包含一个空格,所以它被视为两个参数-cp看到三个参数,而不是您想要的两个
如果在第一个$f周围加上双引号,可以防止名称的两个“一半”被视为单独的文件名:
cp "$f" `echo ...
这是您在bash中需要的,希望它对zsh也有好处
cp "$f" "`echo $f | perl -pe 's/\#\d+ (.+)$/\1/'`"
如果文件名包含空格,您还可以引用cp的第二个参数。我经常使用
dir /b ... | perl -nle"$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n"
-l
会选择输入
-e
检查是为了避免意外地将所有文件重命名为一个名称。我已经做过几次了
在bash中(我猜是zsh),这将是
foreach f (...)
echo "$f" | perl -nle'$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n'
end
或
或
最后一个参数支持带有换行符的文件名。恐怕不行,我在第一个参数周围加了双引号,但仍然会给我同样的错误。@Xiu尝试用echo替换cp,看到发生了什么吗?yi_H在下面找到了它,双引号必须在整个倒勾部分周围-让perl将它们放在文件名周围是行不通的。我不明白,但我想我无论如何都能坚持下去。啊,就是这样。$f周围的双引号是不必要的,但整个反勾部分周围的双引号是必要的。我真的不明白为什么把它们放在那里行得通,但把它们放在里面(在我的原稿中围绕着\1)不行,但我很高兴知道。如果文件名中有空格,$f周围的双引号是必要的。此外,如果文件名中有两个连续的空格,则echo的$f周围也需要双引号。@jfgagne:感谢您提到连续空格,我还没有考虑过。zsh处理
$f
时不带引号,但bourne shell需要“$f”
foreach f (...)
echo "$f" | perl -nle'$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n'
end
find -name '...' -maxdepth 1 \
| perl -nle'$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n'
find -name '...' -maxdepth 1 -exec \
perl -e'for (@ARGV) {
$o=$_; s/.../.../; $n=$_;
rename $o,$n if !-e $n;
}' {} +