2010-11-24 71 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