2017-02-17 5 views
2

У меня есть список файлов, какдобавляющим последовательные числа имен файлов

Ortho234.phy 
Ortho671.phy 
Ortho880.phy and so on 

Я хотел бы переименовать их для работы массива в

Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

Я попытался это, но это заменяет и просто имена файл как 1.phy, 2.phy и так далее.

a=1 
for i in *.phy; do 
    new=$(printf "%04d.phy" "$a") 
    mv -- "$i" "$new" 
    let a=a+1 
done 
+1

'i' ваше имя файла и вы не используете его. – Arijoon

+0

Лично я чувствую, что у вас есть проблема x <-> y, так как вы не получили никакой пользы, переименовав файлы и лучше попросить о помощи с вашей реальной проблемой массива. Файлы все еще находятся в том же порядке, что и до добавления новых номеров. – grail

ответ

5

Любые один из следующих команд будут выполнять свою работу

c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy 

rename 's/\./".".++$a."."/e' *.phy     

rename '$a++; s/\./.$a./e' *.phy     

n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done 

Либо

Он выполняет выражение perl s/// и выполняет переименование от оригинала к заменена строка. В строке замены я использую sprintf для форматирования имени, где я использовать переменные среды c, как счетчик

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

ИЛИ

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

ИЛИ

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ rename 's/\./".".++$a."."/e' *.phy 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

ИЛИ

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ rename '$a++; s/\./.$a./e' *.phy 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 
+0

Я выбираю дверь номер 2! (Переносимость ++) ... И я выберу, если вы удалите параметр [ParsingLS] (http://mywiki.wooledge.org/ParsingLs). :-) – ghoti

+0

также может использовать 'rename '/\./".".++$ a.". "/ E' * .phy' или' rename '$ a ++; s /\./".$ a. "/ e '* .phy', использует [сортировать глобальные переменные] (https: // stackoverflow.com/questions/26127617/what-exact-a-and-b-in-perls-sort-function) – Sundeep

+1

@ghoti: Убрано спасибо за предложение –

1

Это должно сделать работу:

filepart это имя файла без расширения.

1
awk -F\. '{print $1"."NR"."$2}' file 

Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 
1

awk команда также помощь в получении желаемых результатов. NR дает номер строки и разделить на вход . и переписать массив в соответствии необходимая как следующая

awk '{split($0,a,"."); print a[1]"."NR"."a[2]}' file 

файл является входной файл, содержащий следующие значения

Ortho234.phy 
Ortho671.phy 
Ortho880.phy 
+0

awk может читать Input_file сам по себе не нужно использовать cat Input_file | awk .... команда тогда. Обычно это называется UUOC (бесполезное использование команды cat). – RavinderSingh13

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