去掉文件名中的空格 (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:]]/_}"' {} \;
这个问题是众所周知的,但我找不到解决方案:我想重命名目录和文件,用下划线替换空格。由于某些不明原因,以下代码不起作用。这是在 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:]]/_}"' {} \;