关于shell:UNIX将文件/目录重命名为大写

UNIX rename files/directories to uppercase

我正试图用shell脚本将所有目录和文件重命名为大写。我有什么可以用,但不适用于子目录。当脚本执行期间目录名发生变化时,我得到了像mv: cannot stat './def/two/three': No such file or directory这样的东西。

我试过使用带find的-depth,这样它就可以从下到上重命名。但还是遇到了同样的问题。我虽然想用cut来打破/上的路径,并以此方式重命名,但我还是有点茫然。

以下是我的资料:

1
2
3
4
for i in `find . -name"*[a-z]*"`
    do new_name=`echo $i | tr '[a-z]' '[A-Z]'`
    mv $i $new_name
done

我会很感激任何方向,因为我觉得这应该是一个共同的任务,但未能从一些谷歌搜索中找到有效的解决方案。

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


尝试这种方式:

1
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
2
3
4
5
6
7
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

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


这个脚本应该首先在"leaf"中重命名当前路径中的所有文件/目录,以使事情正常工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

IFS=$'
';
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


假设你有这个目录结构/某地/某地//某地/某地/地1/某地/某地/某地/某地/某地/某地

我想你应该以dir2开始重命名,然后转到dir1,以此类推