2012-11-27 7 views
2

У меня есть файлы в нескольких подпапках, я хочу переместить их все в одну папку. Затем мне нравится переименовывать эти файлы.command line bulk rename

/foo/A1000-foobar1412.jpg 
/foo/A1000-foobar213.jpg 
/foo/A1000-foobar314.jpg 
/foo1/B1001-foobar113.jpg 
/foo2/C1002-foobar1123.jpg 
/foo2/C1002-foobar24234.jpg 

То, что я хотел бы получить это:

../bar/A1000-1.jpg 
../bar/A1000-2.jpg 
../bar/A1000-3.jpg 
../bar/B1001-1.jpg 
../bar/C1002-1.jpg 
../bar/C1002-2.jpg 

Так что я до сих пор:

find . -name "*.jpg" -exec mv {} ../bar/ \; 

Но теперь я застрял на переименование файлов.

+0

Сколько дубликатов? http://stackoverflow.com/questions/12292232/rename-batch-of-file-in-unix; http://stackoverflow.com/questions/10977543/rename-multiple-files-linux-ubuntu; http://stackoverflow.com/questions/417916/how-to-do-a-mass-rename; http://stackoverflow.com/questions/3540490/batch-renaming-using-shell-script; ... –

+0

не один, как мой сценарий ... – DarsVaeda

+0

OK ... потому что? Из-за нумерации внутри префикса? Что должно произойти, когда C1002 имеет 10 '.jpg' файлов? 'C1002-10.jpg'? 'C1002-01.jpg',' C1002-02.jpg', ... тоже? Что определяет, какой из '/ foo2/C1002-foobar1123.jpg' и'/foo2/C1002-foobar24234.jpg 'становится' C1002-1.jpg' в любом случае? Это имеет значение? –

ответ

2

Вот скрипт, который просто принимает желаемое базовое имя файла и добавляет инкрементный индекс в зависимости от того, как уже существует много файлов с одними именем в целевом реж:

for file in $(find . -name "*.jpg") 
do 
    bn=$(basename $file) 
    target_name=$(echo $bn | cut -f 1 -d "-") 
    index=$(($(find ../bar -name "$target_name-*" | wc -l) + 1)) 
    target="${target_name}-${index}.jpg" 

    echo "Copy $file to ../bar/$target" 
    # mv $file ../bar/$target 
    cp $file ../bar/$target 
done 

с помощью этого решения вы не можете просто поставить эхо перед мв, чтобы проверить это, как код зависит от реальных файлов в целевой директории для вычисления индекса. Вместо этого используйте cp вместо (или rsync) и удалите исходные файлы вручную, как только вы довольны результатом.

1

Попробуйте это (не проверено):

for file in `find . -name "*.jpg" ` 
do 
    x=$(echo $file | sed 's|.*/||;s/-[^0-9]*/-/;s/-\(.\).*\./-\1./') 
    mv $file ../bar/$x 
done 
+0

изменить на 'echo mv $ file ../ bar/$ x', использовать этот вывод для подтверждения, что все работает по мере необходимости, а затем удалить echo ИЛИ закончить цикл с помощью' done | bash'. Всем удачи. – shellter