首页 > 解决方案 > 重命名 perl 工具:无法重命名,没有这样的文件或目录

问题描述

我正在使用 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 spaces/hello world.txt' 重命名为 '/volumes/data/users-links/adrz/test-site/with-spaces/hello world.txt':没有这样的文件或目录

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

我试过了:

我已经找了好几个星期了,但我无法解决。这是工具中的错误还是我的想法?

谢谢。

标签: bashperlpathrenamespaces

解决方案


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

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

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

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

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

    在这种情况下这有点过头了,但在无法进行简单修改(如 #2 中)的情况下它可能很有用。


推荐阅读