2010-11-24 56 views
3

我试图用shell脚本将所有目录和文件重命名为大写。我有作品,但不适用于子目录。由于在脚本执行期间目录名称正在改变,我得到的东西如mv: cannot stat './def/two/three': No such file or directoryUNIX将文件/目录重命名为大写

我试过用-depth查找,所以它会从下往上重命名。但仍遇到同样的问题。我虽然关于使用cut来拆分/上的路径并重命名,但是无所适从。

这是我有:

​​

我将不胜感激任何方向,因为我觉得这应该是一个共同的任务,但未能找到一些谷歌搜索一个可行的解决方案。我的发行版不支持rename

+0

我建议搬到超级用户。 – Teddy 2010-11-24 16:01:01

+1

如果你有Perl,`rename`是一个非常简单的Perl脚本。你可以使用它来代替二进制文件(它不那么强大)。关于重命名文件和目录,有几十个关于重命名文件和目录的问题,甚至还有一些关于[深度优先](http://stackoverflow.com/search?q=%2Brename+%2Bdepth)的问题。 – 2010-11-24 17:16:59

+0

可能重复的[如何在Linux上将所有文件夹和文件重命名为小写?](http://stackoverflow.com/questions/152514/how-to-rename-all-folders-and-files-to-lowercase-on -linux) – 2010-11-24 17:17:46

回答

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 

或者,如果你想读v ersion(无单行):

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 

这将重命名文件之前,然后他们在目录中,在正确的顺序。

0

可以说你有这个目录结构
/地方/ somethimg/
/地方/ somethimg/DIR1
/地方/ somethimg/DIR1/DIR2

我想你应该开始DIR2重命名,然后去DIR1等

0

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

#!/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