2010-09-07 2 views
3

У меня есть куча файлов на моем сервере, которые выглядят ниже. Мне нужно написать сценарий, который переименует все файлы из JPG в .jpg , как вы можете видеть, некоторые из них уже имеют расширение .jpg, а некоторые нет.Найти файлы без расширения в linux и массой переименовать их

Вы можете мне помочь? Я мог бы сделать это либо в bash, либо через php, что бы облегчить, я просто не знаю, как это сделать.

Благодаря

Джейсон

jects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4742JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4749JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4806JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4726JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4716JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/AGSM-Ground-Floor-2010-036JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4728JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4736JPG.jpg 
media/projects/Education/UNSW-AGSM-Ground-Floor-Thr/DSC4724JPG.jpg 
media/projects/Education/St_Gregorys_School/IMG0100JPG 
media/projects/Education/St_Gregorys_School/IMG0099JPG 
media/projects/Education/St_Gregorys_School/IMG0092JPG 
media/projects/Education/St_Gregorys_School/IMG0090JPG 
media/projects/Education/St_Gregorys_School/IMG0084JPG 
media/projects/Education/St_Gregorys_School/IMG0093JPG 
media/projects/Education/St_Gregorys_School/IMG0097JPG 
media/projects/Education/St_Gregorys_School/IMG0098JPG 
media/projects/Education/St_Gregorys_School/IMG0085JPG 
media/projects/Education/St_Gregorys_School/IMG0091JPG 
media/projects/Education/St_Gregorys_School/IMG0094JPG 
media/projects/Education/St_Gregorys_School/IMG0088JPG 
media/projects/Education/St_Gregorys_School/IMG0087JPG 
media/projects/Education/St_Gregorys_School/IMG0095JPG 
media/projects/Education/St_Gregorys_School/IMG0096JPG 
media/projects/Education/St_Gregorys_School/IMG0089JPG 
media/projects/Education/St_Gregorys_School/IMG0086JPG 

ответ

3

Учитывая имя файла модели в вашем примере, это будет делать трюк:

for F in *[0-9]JPG; do mv $F $F.jpg; done 

Если вам нужно рекурсивное решение:

find . -name "*[0-9]JPG" -exec mv \{\} \{\}.jpg \; 
+0

Это не рекурсивно. – wRAR

+0

Я знаю, следовательно, «учитывая шаблоны имен файлов в вашем примере» - ему не нужно рекурсивное решение в этом случае. –

+0

Добавление рекурсивной альтернативы ... –

4
find . -name '*JPG.jpg' -print0 | xargs -0 rename JPG.jpg .jpg 
find . -name '*JPG' -print0 | xargs -0 rename JPG .jpg 

rename(1) является стандартным инструментом из util-linux

+0

Это не будет переименовывать файлы, которые не содержат точку перед JPG. Так, например, «media/projects/Education/St_Gregorys_School/IMG0086JPG» не будет переименован –

+0

ОК, исправлено это. – wRAR

+0

Я использовал это исправление, и он хорошо работает, спасибо, однако - не позволит ли переименовать файлы, у которых уже есть расширение/ – Jason

0

Это лишь слабо проверялось, но должно работать ....

printf '#!/bin/sh\nmv -v $1 "$1".jpg' > addext.sh 
chmod u+x addext.sh 
find . -type f -name "*[0-9]JPG" -exec ${PWD}/addext.sh "{}" ";" 

Предполагается, что вы работаете с инструментами GNU (что будет, поскольку вы отметили вопрос как linux).

0

Я бы выбрал этот зверь. Не самый элегантный вариант, но переименовывать файлы, оканчивающиеся (без учета регистра) jpg.jpg

find . -type f | grep -i -E '(JPG)*\.*(JPG)+$' | while read file ; do mv $file `echo $file | perl -pe 's!(JPG)*\.*(JPG)+$!.jpg!gi'`; done 
1

Баш 4

#!/bin/bash 
shopt -s globstar 
for file in **/*JPG 
do 
    mv "$file" "${file/JPG/.jpg}" 
done 
+0

zsh знает '**/*' тоже. – wRAR

Смежные вопросы