我正在尝试使用 shell 脚本将所有目录和文件重命名为大写。我所拥有的有效,但不适用于子目录。由于目录名称在脚本执行期间发生变化,我得到类似的信息mv: cannot stat './def/two/three': No such file or directory
我尝试过使用-depth
使用find,它会从下往上重命名。但仍然遇到同样的问题。我想使用cut
打破道路/
并以这种方式重命名,但我不知所措。
这是我所拥有的:
for i in `find . -name "*[a-z]*"`
do new_name=`echo $i | tr '[a-z]' '[A-Z]'`
mv $i $new_name
done
我将不胜感激任何方向,因为我觉得这应该是一项常见任务,但未能从一些谷歌搜索中找到可行的解决方案。
请注意,我无法使用rename
因为我的发行版不支持它。
试试这个方法:
find . -depth |while read LONG; do SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' ); DIR=$( dirname "$LONG" ); if [ "${LONG}" != "${DIR}/${SHORT}" ]; then mv "${LONG}" "${DIR}/${SHORT}" ; fi; done
或者,如果您想要可读版本(无单行):
find . -depth | \
while read LONG; do
SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
DIR=$( dirname "$LONG" )
if [ "${LONG}" != "${DIR}/${SHORT}" ]; then
mv "${LONG}" "${DIR}/${SHORT}"
fi
done
这将按照正确的顺序先重命名文件,然后重命名它们所在的目录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)