LINUX.ORG.RU

Переименование файлов и нумерация

 ,


0

1

Имеются файлы вида:

$ ls -1 | grep 'file.b*'
file.ba
file.bb
file.bc
file.bd
Нужно их переименовать, пронумеровав по порядку. Результат должен выглядеть так:
file1.ba
file2.bb
file3.bc
file4.bd
Придумалось такое решение:
ls -1 | grep 'file.b*' | awk '{print "mv " $0 " file"NR$0}' | sed -e 's/file\./\./g; s/mv /mv file/g' > rename.sh; chmod +x rename.sh; sh rename.sh
но выглядит как-то громоздко. Хотелось бы без создания временного файла обойтись. Что предложите в таком случае?

★★★

Это не громоздко. Громоздко — вот:

cat ~/bin/batchrename
#!/bin/sh
# this script wrote by Eddy 
#
#		batchrename - renames files like 01.ext, 02.ext ...
#
# Создан 17-го Июля 2003 года в 20:35
#   
#   format :  batchrename <list of files>
#        or:              -r <extension> <<list of files> or <dir>>
#   -r - recoursively
counter=0
extrec=""
if [ "$#" -lt "1" ]; then
    echo -e "\n\t\tUsage:\n\tbatchrename [opt]\nopt:"
    echo -e "-r <ext> <folder> (or file list) -- renames recoursively ALL files"
    echo -e "\tin folder <folder> (or by file list given)  with extension .<ext>"
    echo -e "<folder> -- renames ALL files in folder given"
    echo -e "<file list> -- renames ALL files of given filelist.\n\n"
    exit 0
fi
Name="$*"
if [ "$1" = "-r" ]; then
    extrec="$2"
    shift
    shift
    Name="$*"
    [ "$Name" = "" ] && Name="./"
fi
echo -e "\n\t\t\tRENAMING"

del_dup

for file in $Name
do
file=`echo "$file" | sed "s/<>/ /g"`
    if [ -d "$file" ];then
	echo -e "\nDiving into \033[38m $file \033[39m"
	cd "$file"
	if [ "$extrec" != "" ]; then
	    batchrename -r $extrec `ls -1 | sed "s/\ /<>/g"`
	else
	    batchrename `ls -1 | sed "s/\ /<>/g"`	
	fi
	cd ../
	continue
    fi
    ext=`ext "$file"`
    if [ "$ext" = "ion" ]; then
	continue
    fi
    if [ "$extrec" = "" -o "$ext" = "$extrec" ];then
        counter=`expr $counter + 1`
	echo -e "Progress: $counter files\r\c"
        mv "$file" "rnmd$counter.$ext"
    fi
done
echo -e "\n\n\t\t\tENDING"
digits=`echo $counter|awk '{print length ($0)}'`
cnt=1
while [ $digits -gt $cnt ]
do
    f=`ls -S -1|grep "rnmd[0-9]\{$cnt\}\."`
    rename rnmd rnmd0 $f
    cnt=`expr $cnt + 1`
done
if [ "$counter" -gt "0" ]; then
    rename rnmd "" rnmd*
fi
echo -e "\n\t\t\tDone !!!\n"

Eddy_Em ☆☆☆☆☆
()
mkdir tmp && cd tmp
for i in a b c d; do touch file.b$i; done
n=0; for i in *; do let n=n+1; mv $i $(echo $i | sed -e "s/\./$n\./"); done
anonymous
()
ls -1 file.b* | awk -F . 'BEGIN { i = 1 } { print("mv", $1"."$2, $1i"."$2) ; i++ }' | sh
dexpl ★★★★★
()
ls -1 file.b* | awk -F . '{ print("mv", $1"."$2, $1NR"."$2) }' | sh

Совсем забыл про NR в awk

dexpl ★★★★★
()

Спасибо всем ответившим. За это время даже вспомнил про xargs:

ls -1 | grep 'file.b*' | awk '{print  $0 " file"NR$0}' | sed -e 's/file\./\./g; s/^/file/g' | xargs -L1 mv

dadd ★★★
() автор топика
Ответ на: комментарий от dadd

grep ... | awk ... | sed ...

это просто ... э-э-э, ты бутерброд тоже тремя ножами делаешь, один для хлеба, другой для масла, третий для колбасы?

sdio ★★★★★
()
Ответ на: комментарий от dadd

ls -l | grep 'file.b*' зачем это, просто ls file.b?

тем более sdio показал самый лучший вариант, его и надо использовать

anonymous
()
Ответ на: комментарий от dadd

Про функцию «our» не знал.

Это не функция, это объявление глобальной переменной (типа как my для локальных)

sdio ★★★★★
()
Ответ на: комментарий от anonymous

ls -l | grep 'file.b*' зачем это, просто ls file.b?

Там не "-l" ключ для ls, а "-1", который каждый файл в отдельной строке выводит, чтобы awk потом нумеровал.

dadd ★★★
() автор топика
Ответ на: комментарий от sdio

Это не функция, это объявление глобальной переменной (типа как my для локальных)

Странно, в гугле по запросу «our функция» пишут, что функция.

dadd ★★★
() автор топика
Ответ на: комментарий от anonymous

Согласен, grep тут лишний.

dadd ★★★
() автор топика
Ответ на: комментарий от dadd

Там не "-l" ключ для ls, а "-1", который каждый файл в отдельной строке выводит

Я недавно сделал «открытие»: если ls не выводит имена файлов в несколько колонок, если вывод не на консоль. Попробуй ls | cat

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

А ты почитай, думаю даже там найдешь много интересного ;)

kardapoltsev ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.