这个问题众所周知但我找不到解决方案:我希望重命名目录和文件,用下划线替换空格。由于一些不明原因,下面的代码不起作用。这是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
它抱怨没有找到第二个论点。当我复制并粘贴它生成的命令并“手动”启动它时,一切正常。
答案 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:]]/_}"' {} \;