Vraag Hernoem alle bestanden in een map naar opeenvolgende nummers


Ik zou graag alle bestanden in een map hernoemen, zodat er opeenvolgende nummers zijn. Bijvoorbeeld:

1.png
2.png
3.png
etc

Ik weet dat er het commando 'hernoemen' is en ik weet dat er zijn TIENTALLEN van soortgelijke vragen hier, maar ik kan de weg niet vinden.

NOTITIE: Voorgesteld duplicaat bevat geen specifieke oplossing voor mijn geval. Stop met het markeren van dit als duplicaat, omdat gesuggereerd duplicaat mijn vraag niet beantwoordt


3
2017-08-06 19:58


oorsprong


Welk bestand zal zijn 1.png? Shell-globbing-bestelling? - heemayl
@heemayl Ik begrijp niet echt wat je bedoelt, maar de 1.png Ik wil het eerste bestand in de map zijn. - Adam
@Adam Hij vraagt ​​je hoe je de bestanden hebt gesorteerd. De shell sorteert ze op een manier op naam, maar je kunt ze sorteren op de laatst gewijzigde datum, op een andere manier op naam, etc. - wjandrea
@Serg De bestanden hebben de naam met de standaardnaam van de Screenshot-software van Ubuntu. - Adam
CLOSE-KIEZERS: zoals getoond in de commentaren, specificeerde OP specifiek dat hij het voorgestelde duplicaat probeerde en het werkte niet. Gelieve uw stemmen in te trekken. Zien meta.stackexchange.com/a/194479/295160 - Sergiy Kolodyazhnyy


antwoorden:


Ervan uitgaande dat u de shell globbing-volgorde wilt volgen tijdens het sorteren van bestanden, kunt u het volgende doen:

#!/bin/bash
counter=0
for file in *; do 
    [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++))
done

Hier lus over alle bestanden in de huidige map en opeenvolgend hernoemd op basis van de volgorde, als u alleen met de .png bestanden, gebruik for file in *.png in plaats daarvan. counter variabele zal de stappen bijhouden.

Dit is een droogloop, verwijder echo om de daadwerkelijke hernoemingsactie te laten plaatsvinden.

Voorbeeld:

$ counter=0; for file in *; do [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++)); done
mv -i file.txt 1.png
mv -i foo.sh 2.png
mv -i bar.txt 3.png

7
2017-08-06 20:15



Je moet citaten plaatsen $file om te voorkomen dat je op open plekken komt en zet ((counter++)) in een if verklaring om ophogen in mappen te voorkomen. - wjandrea
@wjandrea U hoeft niet te citeren tijdens het gebruik bash trefwoord [[ (in tegenstelling tot [) [[ is een sleutelwoord, bash behandelt het intern evenals de uitbreiding van de woordsplitsing en de bestandsnaam, dus er is geen citaat nodig. Je hebt gelijk over de tweede, vergat dat. Edited..thanks .. - heemayl
Vergeet niet om te controleren of een van uw bestemmingsbestandsnamen al in de map bestaat. Stel dat u het script eenmaal uitvoert, een paar bestanden toevoegt en vervolgens probeert het opnieuw uit te voeren. Wat gebeurt er? - Dave Tweed
@DaveTweed dat is wat de -i optie van mv zal ik doen.. - heemayl
Watis wat de -i optie doet? Zelfs als je een bestand overslaat, krijg je nog steeds niet het juiste resultaat. - Dave Tweed


Hier is een klein pythonscript dat kan doen wat je vraagt

Basis gebruik:

python rename_files.py Pictures/

Het zal de uitvoer naar afdrukken stdout voor het hernoemen van elk bestand

Deze versie pusht de index totdat wordt vastgesteld dat de bestandsnaam met een dergelijke index niet wordt gebruikt. Hoewel bestandsnamen bij verschillende opeenvolgende iteraties van het script kunnen beginnen bij een andere index, blijven de bestanden zelf ongewijzigd.

import os
import sys

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()

duplicates = []
last_index = None
for index,item in enumerate(files):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )
    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)

Alternatieve versie, lost probleem met dubbele bestandsnamen op door timestamp aan elke bestandsnaam toe te voegen en ze vervolgens op te sommen. Deze oplossing kan wat langer duren, naarmate het aantal bestanden toeneemt, maar voor mappen die in honderden reiken, zal dit niet lang duren

import os
import sys
import time

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()
timestamp = str(int(time.time()))
for item in files:
    os.rename( os.path.join(top_dir,item) ,
               os.path.join(top_dir, timestamp + item) )

files2 = os.listdir( top_dir )

for index,item in enumerate(files2):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files2.pop(index)

for index,item in enumerate( files2  ):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )

    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)

2
2017-08-06 22:36



Vergeet niet om te controleren of een van uw bestemmingsbestandsnamen al in de map bestaat. Stel dat u het script eenmaal uitvoert, een paar bestanden toevoegt en vervolgens probeert het opnieuw uit te voeren. Wat gebeurt er? - Dave Tweed
@DaveTweed kan je een voorbeeld geven? twee keer uitvoeren van script zou geen probleem hebben met duplicaten, omdat items telkens worden gesorteerd en opgesomd. Dus als 1.png al bestaat, wordt het gesorteerd en opnieuw hernoemd naar 1.png - Sergiy Kolodyazhnyy
Stel dat ik het script voer om te produceren 1.png door 10.png. Vervolgens voeg ik het bestand toe 3a.png, die moet worden hernoemd naar 4.png, die al bestaat, om nog maar te zwijgen van het hernoemen van alle bestanden daarna. - Dave Tweed
Merk op dat gewoon hebben 1.png door 10.png op zichzelf is een probleem - in de tweede run, wil je de naam wijzigen 10.png naar 2.png, hetzelfde probleem aan het creëren. - Dave Tweed
@DaveTweed is dit het geval dat u bedoelt? paste.ubuntu.com/22518702 - Sergiy Kolodyazhnyy