Ik wil de bestanden in een directory hernoemen naar opeenvolgende nummers. Gebaseerd op de aanmaakdatum van de bestanden.
Bijvoorbeeld sadf.jpg
tot 0001.jpg
, wrjr3.jpg
tot 0002.jpg
en 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, let
en printf
te 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 -i
voorkomt dat bestaande bestanden automatisch worden overschreven, en het gebruik van --
voorkomt dat mv
bestandsnamen 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 .ext
wijzigen 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 “find
is 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 find
naar 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 find
om 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 mv
te 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
-N
niet 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 -r
toe 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 -v1
toont het volgnummer vanaf 001 002 enz. gevolgd door de bestandsnaam.
while read n f; do mv "$f" "$n.avi"; done
verandert 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!
@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 -r
wordt 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 b>opdracht gebruikt, zodat als een bestand spaties in naam bevat, MV B>-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