摆脱文件名中的空格(Unix / Linux)

时间:2015-09-25 06:41:22

标签: bash filenames solaris spaces

这个问题众所周知但我找不到解决方案:我希望重命名目录和文件,用下划线替换空格。由于一些不明原因,下面的代码不起作用。这是Solaris 11上的bash。

find $BASEDIR -type d |grep ' ' | awk '{print "\"" $0 "\""}' >$TMPFIL
cat $TMPFIL | while read FILNAM ; do
 F2=$(echo $FILNAM | sed -e 's/ /_/g' -e 's/\"//g')
 CMD="mv "$FILNAM" "$F2
 echo "Will execute: "$CMD
 $CMD
 done

输出看起来像

Will execute: 
mv "/opt/pakket/smbdata/INTSCAN/ipmdata/Errors/Herstart 2015-01-07" /opt/pakket/smbdata/INTSCAN/ipmdata/Errors/Herstart_2015-01-07
mv: /opt/pakket/smbdata/INTSCAN/ipmdata/Errors/Herstart_2015-01-07 not found

它抱怨没有找到第二个论点。当我复制并粘贴它生成的命令并“手动”启动它时,一切正常。

1 个答案:

答案 0 :(得分:2)

这应该做:

find /path/to/dir -depth -name '*[[:space:]]*' -execdir bash -c 'echo mv "$0" "${0//[[:space:]]/_}"' {} \;

这不会重命名任何内容,只显示将要执行的命令。删除echo前面的mv以实际执行重命名。

如果您的find不支持-execdir(在您的Solaris上似乎就是这种情况),则应执行以下操作:

find -depth -name '*[[:space:]]*' -exec bash -c 'd=${0%/*} b=${0##*/}; echo mv "$d/$b" "$d/${b//[[:space:]]/_}"' {} \;