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

时间:2010-11-24 15:42:36

标签: shell

我正在尝试使用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

我很欣赏任何方向,因为我认为这应该是一项常见任务,但未能从Google搜索中找到可行的解决方案。

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

3 个答案:

答案 0 :(得分: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

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

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

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

答案 1 :(得分:0)

假设你有这个目录结构
  /地方/ somethimg /
  /地方/ somethimg / DIR1
  / somewhere / somethimg / dir1 / dir2

我认为你应该用dir2开始重命名,然后转到dir1,依此类推

答案 2 :(得分:0)

此脚本应首先在“leaf”中重命名当前路径中的所有文件/目录以使其正常工作。

#!/bin/bash

IFS=$'\n';
TMP=/tmp/file_list
rm -f ${TMP};

for file in `find .`
do
num=`echo $file | grep -o  "/" | wc -l`;
echo "$num $file" >> ${TMP};
done

sort -n -r ${TMP} | cut -f 2 -d ' ' > ${TEMP}.temp;

for file in `cat ${TEMP}.temp`
do
echo $file;
## Code to rename file here. All subdirectories would already have been renamed
done