重命名perl工具:无法重命名,没有这样的文件或目录

问题描述 投票:0回答:1

我正在使用Perl重命名工具来编写一个bash脚本,该脚本在其中包含空格的路径中查找任何文件(它做了其他工作,但是试图保持简单)。我正在使用-c开关将其转换为小写,并使用正则表达式将所有空格更改为破折号。该命令没有错误地完成。

rename -f -X -c 's/[ ]+/-/g' /Volumes/data/Users-Links/adrz/test-site/with\ spaces/*

上面将文件转换为小写,但不将破折号替换为空格。然后,我尝试使用表达式前面的-e开关。

rename -f -X -c -e 's/[ ]/-/g' /Volumes/data/Users-Links/adrz/test-site/with\ spaces/*

并获得...

无法将'/ Volumes / data / Users-Links / adrz / test-site / with空格/ hello world.txt'重命名为'/ volumes / data / users-links / adrz / test-site / with-spaces / hello world.txt':无此类文件或目录

似乎正在作用于具有空格以及目录中文件的目录名称。注意,如果路径中没有空格,则可以正常工作。

我尝试过:

  • 使用双引号,单引号和/来删除路径中的空格。
  • 我尝试使用具有相同错误的Subst和Subs-all命令

我已经搜寻了数周,但无法解决。这是该工具中的错误还是我的想法?

谢谢。

bash perl path rename spaces
1个回答
0
投票

除非您也尝试更改目录,否则可以使用以下任何一种:

  1. 从文件所在的目录中运行rename

    sh -c 'cd /Volumes/.../with\ spaces; rename -f -X -c -e "s/[ ]+/-/g" *'
    
  2. 仅匹配没有斜杠(/)的空格。

    rename -f -X -c -e 's{[ ]+(?!.*/)}{-}g' /Volumes/.../with\ spaces/*
    
  3. 将路径分解为其组件,仅对文件名部分进行操作。

    rename -f -X -c -e '
       use Basename qw( dirname basename );
       $_ = dirname($_) . "/" . basename($_) =~ s{[ ]+(?!.*/)}{-}gr
    ' /Volumes/.../with\ spaces/*
    

    在这种情况下,这是过大的杀伤力,但在无法进行简单修改(如#2)的情况下,它可能会很有用。

© www.soinside.com 2019 - 2024. All rights reserved.