UNIX将文件/目录重命名为大写

Jas*_*ary 3 shell

我试图用shell脚本将所有目录和文件重命名为大写.我有什么工作,但不适用于子目录.由于目录名在脚本执行期间发生了变化,我得到了类似的东西mv: cannot stat './def/two/three': No such file or directory

我尝试过使用-depthfind,所以它会从下往上重命名.但仍然遇到同样的问题.我虽然cut试图分开路径/并重命名,但我不知所措.

这就是我所拥有的:

for i in `find . -name "*[a-z]*"`
    do new_name=`echo $i | tr '[a-z]' '[A-Z]'`
    mv $i $new_name
done
Run Code Online (Sandbox Code Playgroud)

我希望任何方向,因为我觉得这应该是一项常见的任务,但未能找到一些谷歌搜索的工作解决方案.

请注意,我不能使用,rename因为我的发行版不支持.

Bar*_*min 8

试试这种方式:

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
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要可读的版本(没有单行):

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
Run Code Online (Sandbox Code Playgroud)

这将按照正确的顺序重命名文件,然后重命名它们所在的目录.