2010-11-24 2 views
3

Я пытаюсь переименовать все каталоги и файлы в верхний регистр с помощью сценария оболочки. У меня есть работы, но не для подкаталогов. Поскольку имена каталогов меняются во время выполнения скриптов, я получаю такие вещи, как mv: cannot stat './def/two/three': No such file or directoryUNIX переименовывать файлы/каталоги в верхний регистр

Я попытался использовать -depth с поиском, чтобы он переименовал снизу вверх. Но все равно сталкиваются с той же проблемой. Я хотя об использовании 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, так как он не поддерживается моим дистрибутивом.

+0

Я предлагаю переход к SuperUser. – Teddy 2010-11-24 16:01:01

+1

Если у вас есть Perl, `rename` - чрезвычайно простой скрипт Perl. Вы можете использовать его вместо двоичного (что не так сильно). Есть десятки вопросов о SO о переименовании файлов и каталогов и даже о некоторых из них [глубина-первый] (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