Переименуйте несколько файлов в BASH - PullRequest
4 голосов
/ 10 марта 2010

Я хочу переименовать файлы: у меня есть файлы с '???' формат мне нужно поместить их в «????».

myfile_100_asd_4 to myfile_0100_asd_4

Спасибо Арман.

Не очень элегантно. РЕШЕНИЕ:

#/bin/bash
snap=`ls -t *_???`
c=26 
for k in $snap 
do 

     end=${k}
     echo  mv  $k ${k%_*}_0${k##*_}_asd_4
     (( c=c-1 ))

done

Это работает для меня, потому что у меня также есть файлы myfile_100.

Ответы [ 4 ]

8 голосов
/ 10 марта 2010

Используйте rename, небольшой скрипт, который поставляется с perl:

rename 's/(\d{3})/0$1/g' myfile_*

Если вы передадите ему параметр -n перед выражением, оно только печатает то, что переименовал бы, что было бы сделано, никаких действийприняты.Таким образом, вы можете убедиться, что он работает нормально, прежде чем переименовать файлы:

rename -n 's/(\d{3})/0$1/g' myfile_*
5 голосов
/ 10 марта 2010

просто используйте оболочку,

for file in myfile*
do
    t=${file#*_}
    f=${file%%_*}
    number=$(printf "%04d" ${t%%_*})
    newfile="${f}_${number}_${t#*_}"
    echo mv "$file" "$newfile"
done
1 голос
/ 10 марта 2010

Существует UNIX-приложение под названием ren ( manpage ), которое поддерживает переименование нескольких файлов с использованием шаблонов поиска и подстановки. Вы должны быть в состоянии собрать воедино шаблон, который вставит лишние 0 в имя файла.

Редактировать: Страница проекта с ссылкой для скачивания находится по адресу Freshmeat .

0 голосов
/ 10 марта 2010

Попробуйте:

for file in `ls my*`
do
a=`echo $file | cut -d_ -f1`
b=`echo $file | cut -d_ -f2`
c=`echo $file | cut -d_ -f3,4`

new=${a}_0${b}_${c}
mv $file $new
done
...