Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl-pe操作文件名_Perl_Shell - Fatal编程技术网

perl-pe操作文件名

perl-pe操作文件名,perl,shell,Perl,Shell,我试图在shell中快速清理文件名(如果有必要的话,可以是zsh)。重命名文件。(为了安全起见,我使用了cp而不是mv) 现在,我知道有一些工具可以做这样的事情,但出于个人兴趣,我想知道我怎么能这样做。现在,我得到一个错误: cp: target `When.ogg"' is not a directory 其中'When.ogg'是文件名的最后一部分。我尝试添加引号(见上文)并转义空格,但这是我得到的结果 有什么原因不能使用s perl pmr=的输出吗;omrt作为另一个命令行工具的最终参

我试图在shell中快速清理文件名(如果有必要的话,可以是zsh)。重命名文件。(为了安全起见,我使用了
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;
   }' {} +