bash - 重命名 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':没有这样的文件或目录
它似乎作用于具有空格的目录名称以及目录中的文件。请注意,如果路径中没有空格,则可以正常工作。
我试过了:
- 使用双引号、单引号和 / 来转义路径中的空格。
- 我尝试过使用 Subst 和 Subs-all 命令,但错误相同
我已经找了好几个星期了,但我无法解决。这是工具中的错误还是我的想法?
谢谢。
解决方案
除非您还尝试更改目录,否则您可以使用以下任何一种:
rename
从文件所在的目录运行。sh -c 'cd /Volumes/.../with\ spaces; rename -f -X -c -e "s/[ ]+/-/g" *'
/
仅匹配不带斜杠 ( )的空格。rename -f -X -c -e 's{[ ]+(?!.*/)}{-}sg' /Volumes/.../with\ spaces/*
将路径分解为其组件,并且仅对文件名部分进行操作。
rename -f -X -c -e ' use Basename qw( dirname basename ); $_ = dirname($_) . "/" . basename($_) =~ s/[ ]+/-/gr; ' /Volumes/.../with\ spaces/*
在这种情况下这有点过头了,但在无法进行简单修改(如 #2 中)的情况下它可能很有用。
推荐阅读
- r - 如何在 case_when statemet 中指定一系列列来检查 R 中的条件?
- android - Kotlin + 刀柄错误。[Hilt] 和 java.lang.reflect.InvocationTargetException(无错误消息)
- regex - .*? 之间的可选元素
- javascript - 如果我使用 Google 策略登录,NUXTJS 身份验证将使用查询字符串重定向到 /login
- sql - 在 django 模板中的另一个大括号内使用大括号
- kubernetes - 如何使用 kubectl 查看当前命名空间?
- javascript - 从代理返回 http.ClientRequest?
- json - Salesforce - 删除 REST 类的不需要的 JSON 数据
- c# - 使用带有 C# 的公钥验证 JWT
- php - 时间与 laravel 格式不匹配