去掉文件名中的空格 (Unix/Linux)

Getting rid of spaces in filenames (Unix/Linux)

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

find $BASEDIR -type d |grep ' ' | awk '{print "\"" [=11=] "\""}' >$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

它抱怨找不到第二个参数。当我复制并粘贴它生成的命令并启动它时 "manually",但一切正常。

应该这样做:

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

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

如果您的 find 不支持 -execdir(在您的 Solaris 上似乎是这种情况),应该这样做:

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