Puncte:2

Cum să redenumiți în loturi numerele prefixate secvenţial la noi prefixe secvenţiale prin terminal?

drapel ng

Cum pot redenumi în lot, folosind terminalul, un set de fișiere în care mai multe numere au același prefix, astfel încât toate acele prefixe să fie setate la altele noi?

De exemplu:

011.foo.txt -> 001.foo.txt
011.bar.psd -> 001.bar.psd
011.baz.gif -> 001.baz.gif
012.qux.js -> 002.qux.js
012.corge.png -> 002.corge.png
...
020.thud.txt -> 010.thud.txt

Aș dori să folosesc comanda rename dacă este posibil:

redenumiți [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -e|-E perlexpr]*|perlexpr [fișiere]

Apreciez cu adevărat ajutorul tău în a descoperi acest lucru, mulțumesc!

drapel hr
Doriți să reduceți pur și simplu valoarea numerică a prefixului cu 10 în fiecare caz?
user10489 avatar
drapel in
Relația dintre numerele sursă și țintă nu este clară. O singură invocare a comenzii de redenumire nu va putea face o manipulare complexă ca aceasta. O abordare sigură pentru ceva de genul acesta ar fi generarea unui fișier (folosind awk? Perl?) cu mai multe comenzi mv și examinarea rezultatelor și editarea eventualelor probleme și rularea fișierului.
io4250 avatar
drapel ng
@steeldriver este o soluție interesantă la care nu m-am gândit. Dar, în mod ideal, aș dori ca fișierele redenumite să înceapă într-un anumit punct (de exemplu, 001 sau 005) fără a face calculul dacă este posibil, astfel încât să pot folosi aceeași soluție, indiferent de numărul inițial din lista curentă de fișiere.
io4250 avatar
drapel ng
@user10489 Ne pare rău, am făcut o greșeală de tipar în exemplul meu și am actualizat-o (010.thud.txt a fost numit anterior 003.thud.txt)
Puncte:2
drapel hr

Dacă doriți ca fișierele cu același prefix original să fie mapate la același prefix în noua schemă fără bazându-se pe scădere, atunci ai putea face acest lucru prin crearea unui hash (matrice asociativă) a prefixelor, numerotându-le secvențial, apoi efectuând înlocuiri de redenumire prin căutare în hash. Ex.

$ redenumiți -n -E '
  ÎNCEPE {
    my $n = 1;
    %pfx-urile noastre;
    foreach my $f (@ARGV) {
      $pfxs{$1} = (există $pfxs{$1} ? $pfxs{$1} : $n++) dacă $f =~ /^(\d{3})/
    }
  }
  %pfx-urile noastre;
  s/^(\d{3})/sprintf „%03d”, $pfxs{$1}/e
' [0-9][0-9][0-9].*
redenumește(011.bar.psd, 001.bar.psd)
redenumește(011.baz.gif, 001.baz.gif)
redenumește(011.foo.txt, 001.foo.txt)
redenumește(012.corge.png, 002.corge.png)
redenumește(012.qux.js, 002.qux.js)
redenumește(020.thud.txt, 003.thud.txt)

Deoarece nu se bazează pe scădere, această metodă poate fi folosită chiar și atunci când prefixele originale nu sunt numerice.

Acest lucru poate fi, fără îndoială, îmbunătățit - în special, se poate verifica valoarea maximă a $n la sfârșitul mapării și alegeți lățimea rezultatului în consecință.

io4250 avatar
drapel ng
Îmi pare rău @steeldriver, am făcut o greșeală când am tastat 003.thud.txt, de fapt am vrut să scriu 010.thud.txt
drapel hr
@io4250 tbh Am presupus că nu a contat cu adevărat, deoarece nu avem părțile „...” ale secvenței
Puncte:2
drapel cn

Folosind perl redenumiți așa cum a solicitat.

Pentru ceea ce demonstrează întrebarea dvs.:

redenumiți -n „s/^(\d+)/sprintf „%03d”, $1-10/e” *

ieșire de funcționare uscată:

redenumește(011.bar.psd, 001.bar.psd)
redenumește(011.baz.gif, 001.baz.gif)
redenumește(011.foo.txt, 001.foo.txt)
redenumește(012.corge.png, 002.corge.png)
redenumește(012.qux.js, 002.qux.js)
redenumește(020.thud.txt, 010.thud.txt)

Pentru ceea ce spune titlul întrebării, cu prefixe succesive reale:

redenumiți -n -E „utilizați vars q{$n}” -e „s/^(\d+)/sprintf „%03d”, ++$n/e” *
redenumește(011.bar.psd, 001.bar.psd)
redenumește(011.baz.gif, 002.baz.gif)
redenumește(011.foo.txt, 003.foo.txt)
redenumește(012.corge.png, 004.corge.png)
redenumește(012.qux.js, 005.qux.js)
redenumește(020.thud.txt, 006.thud.txt)

Pentru primul, dacă nu doriți să codificați delta 10:

redenumiți -n -E 'utilizați vars q{$delta}' -e '
    s{^(\d+)}{
        $delta = $1 - 1 dacă nu este definit $delta;
        sprintf „%03d”, $1 - $delta
    }e
'*
Puncte:1
drapel jp

În bash

Încercați acest lucru (rulare uscată) din directorul care conține fișierele:

pentru f în *
do
    r="${f#*.}"
    p="${f%%.*}"
    if [ "$p" -eq "$p" ] 2>/dev/null
    atunci  
    p="$((10#$p - 10))"
    p="$(printf "%03d" $p)"
    echo mv -- "$f" "$p.$r"
    fi 
Terminat

Dacă sunteți mulțumit de rezultatul tipărit, atunci schimbați linia:

echo mv -- "$f" "$p.$r"

la:

mv -- "$f" "$p.$r"

îndepărtarea ecou pentru a face redenumirea propriu-zisă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.