Автор Гілка: Масове переіменування  (Прочитано 3691 раз)

zzandy

  • Гість
Всім привіт!

Є таке питання, якщо у мене є багато файлів з якоюсь спільною ознакою (наприклад, суфікс) і треба, щоб всі ці файли називалися так:

00001-<попереднє ім`я без суфікса>.ext
00002-<попереднє ім`я без суфікса>.ext
.....
02345-<попереднє ім`я без суфікса>.ext


тобто треба здійснити масове перейменування, як ви це порадите зробити в Лінуксі? Мені в таких випадках досі допомагав інструмент з Total Commander-а - просто і досить потужно - але це ж не лінукс-стайл.

Відсутній iip))

  • Графоман
  • ****
  • дописів: 277
  • Карма: +0/-0
  • Перекладач KDE, openSUSE...
Re: Масове переіменування
« Відповідей #1 : 2006-09-29 23:23:49 »
Під KDE
Krusader або просто
KRename
"You should not be satisfied with being a victim, nor with being a survivor. You should aim to be a conqueror." "Now, go do the right thing!" Dr. Laura

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Re: Масове переіменування
« Відповідей #2 : 2006-09-30 01:56:15 »
for i in `find <директорія> -iname '*.старийсуфікс'` ; do mv $i `echo $i|sed 's/\.старийсуфікс$/.новийсуфікс/'`; done

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Масове переіменування
« Відповідей #3 : 2006-09-30 07:47:09 »
#! /bin/bash

DIR_LIST=( "aaa/bb cc" "aaa/cc dd" )

IFS="
"
flist=( $( find ${DIR_LIST
  • } -type f -iregex '.*\.oldext' -print ) )

num=${#flist
  • }


i=${#num}
while (( i-- )) ; do
    tmpl="${tmpl}0"
done

while (( num )) ; do
    fil="${flist[$(( num - 1 ))]}"
    nfil="${fil%/*}/${tmpl:${#num}}${num}-${fil##*/}"
    mv -v "${fil}" "${nfil%.oldext}.newext"
    (( --num ))
done

# Кінець :D :D :D
Цей код розуміє імена з пробілами. І нумерує доповнюючи нулями.
Щоправда, щоб довести його до такого стану знадобилося пів години... :)
« Змінено: 2006-09-30 07:51:28 від ISBear »

Відсутній Ign1111

  • Письменник
  • *****
  • дописів: 829
  • Карма: +0/-0
  • Linux 4ever!
Re: Масове переіменування
« Відповідей #4 : 2006-10-01 22:10:31 »
Під KDE
Krusader або просто
KRename

А може ще є щось таке для того щоб поміняти один текст на інший одразу в купі файлів?
Linux. The future is open.

zzandy

  • Гість
Re: Масове переіменування
« Відповідей #5 : 2006-10-02 09:22:52 »
Я подивився Krename - це, в принципі, те, що треба. Скрипти нмд не досить гнучкі. А якщо треба вставити інформацію з тегів музичного файла (це мені особливо сподобалось у Krename).  Одним словом так набагато швидше, ніж скриптом.

Відсутній 235

  • Кореспондент
  • ***
  • дописів: 238
  • Карма: +0/-0
Re: Масове переіменування
« Відповідей #6 : 2006-10-02 13:38:44 »
Скрипти нмд не досить гнучкі.
тююю - то тільки може бути думка певно дуже не свідущого в скриптуванні.

це аналогічно висловлюванню "С не гнучкий для написання програм"
Олександр Приймак |  Google Web Toolkit

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Масове переіменування
« Відповідей #7 : 2006-10-02 15:46:45 »
Воістину. На shell-скриптах навіть гуй пишуть: http://cimi.netsons.org/pages/murrine/configurator.php

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Масове переіменування
« Відповідей #8 : 2006-10-02 17:27:17 »
А може ще є щось таке для того щоб поміняти один текст на інший одразу в купі файлів?

perl -pi -e 's/old text regexp/new text/g' files...

або

find /path/to/dir -name '*.txt' -print0 | xargs --null -l100 perl -pi.orig -e 's/old text regexp/new text/g'

читати man perlrun, find, xargs
[Fedora Linux]

zzandy

  • Гість
Re: Масове переіменування
« Відповідей #9 : 2006-10-02 17:37:50 »
Кажучи про гнучкість я мав на увазі, що якщо вам треба сьогодні переіменувати *.txt в <дата>-##### а завтра треба {a,b,d,g}/*.ogg переіменувати в <виконавець>/<альбом> - <назва>.ogg (і це вам треба зробити один раз), то зручніше було б все-таки мати універсальний інструмент, інакше затрати не відповідають цілі.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Масове переіменування
« Відповідей #10 : 2006-10-02 17:50:20 »
Мені в таких випадках досі допомагав інструмент з Total Commander-а - просто і досить потужно - але це ж не лінукс-стайл.

Ну я mc-кою користуюся в простих випадках. Виділив файли, натиснув F6, у верхньому рядку набрав "*.oldsuffix", в нижньому: "*.newsuffix", натиснув ввід. Складніші випадки (напр. "*foo*bar*" на "*foobar*") теж підтримуються. Але для серйозної роботи - тільки perl.

fpmv - шукати find-ом й перейменовувати по regexp-у. Перший аргумент regexp, решта - параметри find.
$ cat ~/bin/fpmv
#!/bin/bash
REGEXP="$1"; shift;

find "$@" | perl -MFile::Copy -ne 'chomp; my $old=$_; '$REGEXP'; if($old ne $_) { print "Moving \"$old\" to \"$_\".\n"; move ($old, $_); }'

pmv - Перший аргумент regexp, решта - файли.

$ cat ~/bin/pmv
#!/bin/bash
REGEXP="$1"; shift;

for I in  "$@" ; do echo "$I"; done | perl -MFile::Copy -ne 'chomp; my $old=$_; '$REGEXP'; if($old ne $_) { print "Moving \"$old\" to \"$_\".\n"; move ($old, $_); }'

Приклади:
$ ls -1
test file1.txt
test file2.txt
test file3.txt

$ pmv 's/test/best/' *.txt
Moving "test file1.txt" to "best file1.txt".
Moving "test file2.txt" to "best file2.txt".
Moving "test file3.txt" to "best file3.txt".

$ fpmv 's/test/best/' . -name '*.txt'
Moving "./test file2.txt" to "./best file2.txt".
Moving "./test file3.txt" to "./best file3.txt".
Moving "./test file1.txt" to "./best file1.txt".


Хоча "mmv" теж непогана утиліта.
« Змінено: 2006-10-02 17:52:14 від lvm »
[Fedora Linux]

Відсутній iip))

  • Графоман
  • ****
  • дописів: 277
  • Карма: +0/-0
  • Перекладач KDE, openSUSE...
Re: Масове переіменування
« Відповідей #11 : 2006-10-02 19:54:01 »
Під KDE
Krusader або просто
KRename

А може ще є щось таке для того щоб поміняти один текст на інший одразу в купі файлів?
Програма KFileReplace (як і KRename) якраз для того і написана програмістими, щоб прості користувачі не мусили морочити собі голову зі скриптами.
"You should not be satisfied with being a victim, nor with being a survivor. You should aim to be a conqueror." "Now, go do the right thing!" Dr. Laura

Відсутній Ign1111

  • Письменник
  • *****
  • дописів: 829
  • Карма: +0/-0
  • Linux 4ever!
Re: Масове переіменування
« Відповідей #12 : 2006-10-02 20:56:33 »
А може ще є щось таке для того щоб поміняти один текст на інший одразу в купі файлів?
Програма KFileReplace (як і KRename) якраз для того і написана програмістими, щоб прості користувачі не мусили морочити собі голову зі скриптами.

Колись я спробував KFileReplace. Щось я недокумекав як це робиться. :( Якщо Ви кажите, що ця програма на таке здатна, то спробую ще раз. Дякую. :)
Linux. The future is open.

Відсутній Дмитро Редчук

  • Кореспондент
  • ***
  • дописів: 104
  • Карма: +0/-0
Re: Масове переіменування
« Відповідей #13 : 2006-10-24 12:20:24 »
Всім привіт!

Є таке питання, якщо у мене є багато файлів з якоюсь спільною ознакою (наприклад, суфікс) і треба, щоб всі ці файли називалися так:

00001-<попереднє ім`я без суфікса>.ext
00002-<попереднє ім`я без суфікса>.ext
.....
02345-<попереднє ім`я без суфікса>.ext

Це досить простий випадок, тут можна bash'ем:
ext="txt"
suffix="suffix"

for f in *.$ext; do
 fshort=${f%%$suffix.$ext}
 mv $f $fshort.$ext
done
«Критика має бути конструктивною. Інакше вона деструктивна» ©
Щось не так? — Зроби так.