有人可以帮我弄清楚如何从目录名称中删除双空格吗?
我正在使用一项服务,该服务为我提供名称包含空格的文件的目录结构。有时目录名称包含双空格,我的一些自制脚本无法处理它。
我想要一个 shell 命令组合,它将重命名目录并删除双空格。有点像sed 's/ / /g'
。
幸运的是,没有子目录的父目录也需要重命名。
我可以这样找到候选人
sh> find ~/Downloads/Scala_Intro -name '* *' -print
/Users/jimka/Downloads/Scala_Intro/SCALAIN_E-Running Average-362/Edward Cacioppo_2973_assignsubmission_file_
/Users/jimka/Downloads/Scala_Intro/SCALAIN_E-Implement histogram-3169/Edward Cacioppo_3102_assignsubmission_file_
但是当我尝试使用xargs
操作这个行序列时,xargs
替换似乎删除了双空格。因此我无法生成命令行mv old-name new-name
sh> find ~/Downloads/Scala_Intro -name '* *' -print | xargs -I % echo %
/Users/jimka/Downloads/Scala_Intro/SCALAIN_E-Running Average-362/Edward Cacioppo_2973_assignsubmission_file_
/Users/jimka/Downloads/Scala_Intro/SCALAIN_E-Implement histogram-3169/Edward Cacioppo_3102_assignsubmission_file_
我正在尝试类似以下的方法,但它不起作用。
sh> find ~/Downloads/Scala_Intro -name '* *' -print | xargs -p -I % mv "%" `echo "%" | sed 's/ / /g'`
mv /Users/jimka/Downloads/Scala_Intro/SCALAIN_E-Running Average-362/Edward Cacioppo_2973_assignsubmission_file_ /Users/jimka/Downloads/Scala_Intro/SCALAIN_E-Running Average-362/Edward Cacioppo_2973_assignsubmission_file_?...
请注意,当 xargs 询问是否执行该mv
命令时,双倍空格已经转换为单倍空格。
答案1
而不是xargs
和mv
,我更喜欢rename
工具:
取决于您拥有的重命名工具:
find ~/Downloads/Scala_Intro -name '* *' -exec rename -n ' ' ' ' {} +
或者
find ~/Downloads/Scala_Intro -name '* *' -exec rename -n 's/ / /' {} +
(-n
如果您对输出满意,请删除选项(空运行)以实际执行重命名)
或者如果你想坚持使用mv
(不需要xargs
,find -exec
可以):
find ~/Downloads/Scala_Intro -name '* *' -exec sh -c 'mv "$1" "${1// / }"' find-sh {} \;