Bestanden in een map hernoemen naar opeenvolgende nummers

Ik wil de bestanden in een directory hernoemen naar opeenvolgende nummers. Gebaseerd op de aanmaakdatum van de bestanden.

Bijvoorbeeld sadf.jpgtot 0001.jpg, wrjr3.jpgtot 0002.jpgen zo aan, het aantal voorloopnullen afhankelijk van het totale aantal bestanden (geen extra nullen nodig indien niet nodig).


Antwoord 1, autoriteit 100%

Probeer een lus, leten printfte gebruiken voor de opvulling:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
  mv -i -- "$i" "$new"
  let a=a+1
done

het gebruik van de vlag -ivoorkomt dat bestaande bestanden automatisch worden overschreven, en het gebruik van --voorkomt dat mvbestandsnamen interpreteert met streepjes als opties.


Antwoord 2, autoriteit 97%

Schoonheid in één regel:

ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done 

Je kunt .extwijzigen met .png, .jpg, enz.


Antwoord 3, autoriteit 17%

Ik hou van de oplossing van Gauteh vanwege zijn eenvoud, maar hij heeft een belangrijk nadeel. Als u duizenden bestanden gebruikt, kunt u de melding “argumentenlijst te lang” krijgen (meer hierover), en ten tweede kan het script erg traag worden. In mijn geval, draaiend op ongeveer 36.000 bestanden, verplaatste het script ongeveer. één item per seconde! Ik weet niet precies waarom dit gebeurt, maar de regel die ik van collega’s kreeg was findis your friend”.

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

Om items te tellen en commando’s te bouwen, werd gawkgebruikt. Let echter op het belangrijkste verschil. Standaard zoekt findnaar bestanden in de huidige directory en zijn subdirectories, dus zorg ervoor dat u het zoeken beperkt tot alleen de huidige directory, indien nodig (gebruik man findom te zien hoe).


Antwoord 4, autoriteit 10%

Een zeer eenvoudige bash one-liner die de originele extensies behoudt, voorloopnullen toevoegt en ook werkt in OSX:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

Vereenvoudigde versie van http://ubuntuforums.org/showthread.php?t=1355021


Antwoord 5, autoriteit 9%

het gebruik van Pero’s oplossing op OSX vereiste enige aanpassing. Ik gebruikte:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

opmerking: de backslashes zijn bedoeld om de regel voort te zetten

bewerk 20 juli 2015:
heeft de feedback van @klaustopher opgenomen om het argument \"%s\"van de opdracht mvte citeren om bestandsnamen met spaties te ondersteunen.


Antwoord 6, autoriteit 8%

met de opdracht “hernoemen”

rename -N 0001 -X 's/.*/$N/' *.jpg

of

rename -N 0001 's/.*/$N.jpg/' *.jpg

Antwoord 7, autoriteit 4%

Om in alle situaties te werken, zet u een \” voor bestanden die ruimte hebben in de naam

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash

Antwoord 8, autoriteit 3%

Als uw rename-Nniet ondersteunt, kunt u zoiets als dit doen:

ls -1 --color=never -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

BewerkenOm met een bepaald nummer te beginnen, kun je de (enigszins lelijk uitziende) code hieronder gebruiken, vervang gewoon 123 door het gewenste nummer:

ls -1 --color=never  -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

Hiermee worden bestanden weergegeven in volgorde van aanmaaktijd (nieuwste eerst, voeg -rtoe aan ls om omgekeerd te sorteren), en verzendt vervolgens deze lijst met bestanden om de naam te wijzigen. Hernoemen gebruikt perl-code in de regex om de teller te formatteren en te verhogen.

Als je echter te maken hebt met JPEG-afbeeldingen met EXIF-informatie, raad ik exiftool

aan

Dit komt uit de exiftool-documentatie, onder “Voorbeelden hernoemen”

  exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.

Antwoord 9, autoriteit 3%

In OSXinstalleer je het hernoemingsscript van Homebrew:

brew install rename

Dan kun je het echt belachelijk gemakkelijk doen:

rename -e 's/.*/$N.jpg/' *.jpg

Of om een ​​leuk voorvoegsel toe te voegen:

rename -e 's/.*/photo-$N.jpg/' *.jpg

Antwoord 10

Volg het commando hernoem alle bestanden naar de volgorde en ook de extensie in kleine letters:

rename --counter-format 000001 --lower-case --keep-extension --expr='$_ = "$N" if @EXT' *

Antwoord 11

find .  | grep 'avi' | nl -nrz -w3 -v1 | while read n f; do mv "$f" "$n.avi"; done

find .toont alle bestanden in map en submappen.

grep 'avi'filtert alle bestanden met de avi-extensie.

nl -nrz -w3 -v1toont het volgnummer vanaf 001 002 enz. gevolgd door de bestandsnaam.

while read n f; do mv "$f" "$n.avi"; doneverandert de bestandsnaam in volgnummers.


Antwoord 12

Ik had een soortgelijk probleem en heb om die reden een shellscript geschreven. Ik heb besloten om het te posten ondanks het feit dat er al veel goede antwoorden zijn gepost, omdat ik denk dat het nuttig kan zijn voor iemand. Voel je vrij om het te verbeteren!

numereren

@Gnutt Het gewenste gedrag kan worden bereikt door het volgende te typen:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

Als de optie -rwordt weggelaten, wordt het ruimen alleen gesimuleerd (zou handig moeten zijn bij het testen).

De optie L beschrijft de lengte van het doelnummer (dat zal worden gevuld met voorloopnullen)
het is ook mogelijk om een ​​prefix/suffix toe te voegen met de opties -p <prefix>-s <suffix>.

Als iemand wil dat de bestanden numeriek worden gesorteerd voordat ze worden genummerd, verwijder dan gewoon de optie -o modtime.


Antwoord 13

a=1
for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done

14

Hier is wat voor mij gewerkt.
Ik heb hernoemen opdracht gebruikt, zodat als een bestand spaties in naam bevat, MV -opdracht niet in de war raken tussen spaties en daadwerkelijk bestand.

Hier heb ik spaties vervangen, '' in een bestandsnaam met '_' voor alle JPG-bestanden 
#! / bin / bash
Hernoemen 'y / / _ /' * jpg #Replacing spaties met _
laat x = 0;
voor i in * .jpg; do
  Laat X = (x + 1)
  mv $ i $ x.jpg
gedaan

Other episodes