αλλαγή αρίθμισης στα filename  Το θέμα επιλύθηκε

...εφαρμογές για οτιδήποτε άλλο

Συντονιστής: konnn

αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό bobptz » 23 Οκτ 2014, 13:03

Έχω μία σειρά από αρχεία με ονόματα:
file-001.jpg
file-002.jpg
file-003.jpg
file-004.jpg
file-005.jpg
....


Θέλω να αλλάξω την αρίθμιση και να ονομαστούνε αντίστοιχα σε :

file-035.jpg
file-036.jpg
file-037.jpg
file-038.jpg
file-039.jpg
....

έψαξα και δε βρήκα κάποιο τρόπο να το κάνω. Εσείς ξέρετε κάποιον?

Τα αρχεία αυτά είναι σελίδες από pdf που έβγαλα με την ακόλουθη εντολή:
pdftoppm -jpeg test.pdf prefix

Έψαξα στα options του pdftoppm, μήπως τα ξαναβγάλω με τους αριθμούς που εγώ θέλω. Αλλά και πάλι δε βρήκα κάτι.
Γνώσεις Linux: Μαθαίνω ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό


bobptz
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 659
Εγγραφή: 28 Δεκ 2012, 02:39
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό Reinach » 23 Οκτ 2014, 14:12

Αφού γνωρίζεις προγραμματισμό, μπορείς να μελετήσεις την απάντηση σε αυτό:
http://askubuntu.com/questions/151435/rename-files-with-a-shift-in-numbers

εγώ κατάλαβα κάποια πράγματα αλλά όχι όλα. Αλλά πρέπει να κάνει τη δουλειά.
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Καθόλου ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 22.04 Jammy Jellyfish 5.15.0-58-generic 64bit (el_GR.UTF-8, MATE mate)
3 Intel Core i5-1035G1 CPU @ 1.00GHz ‖ RAM 19566 MiB ‖ LENOVO LNVNB161216 - LENOVO 81WE
4 Intel Iris Plus Graphics G1 (Ice Lake) [8086:8a56] {i915}
5 wlp0s20f3: Intel Ice Lake-LP PCH CNVi WiFi [8086:34f0] (rev 30) ⋮ enx7cc2c61085a5: 2357:0601 TP-Link UE300 10/100/1000 LAN (ethernet mode) [Realtek RTL8153]
Άβαταρ μέλους
Reinach
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 692
Εγγραφή: 09 Νοέμ 2008, 20:48
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό PapaNight » 23 Οκτ 2014, 19:54

Με την προυπόθεση πως τα αρχεία λήγουν όλα σε ένα τριψηφιο νούμερο τελεία τριψήφια κατάληξη (jpg)
Ανοίγεις ένα τερματικό και πας στο φάκελο με τα αρχειά και δίνεις.

Αφαίρεσα το σκριπτ γιατί είναι λάθος... Το σωστό παρακάτω.
Τελευταία επεξεργασία από PapaNight και 25 Οκτ 2014, 14:25, έχει επεξεργασθεί 1 φορά/ες συνολικά
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Αρχάριος ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 14.04, Windows 7
3 AMD Phenom II X6 1075T Processor ‖ RAM 16050 MiB ‖ ASRock 870 Extreme3
4 AMD nee ATI Cape Verde XT [Radeon HD 7770 GHz Edition] [1002:683d] {fglrx_pci}
5 eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06) ⋮ wlan1: Atheros Inc. AR922X Wireless Network Adapter [168c:0029] (rev 01)
PapaNight
babeTUX
babeTUX
 
Δημοσιεύσεις: 64
Εγγραφή: 23 Μαρ 2011, 22:51
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό bobptz » 23 Οκτ 2014, 21:11

Reinach

Δε μπορώ να καταλάβω το παράδειγμα. Αλλά μου άνοιξες την όρεξη με τον προγραμματισμό και εγκατέστησα το Lazarus ( για τη free pascal).

PapaNight πολύ καλό το σκριπτάκι.

Μήπως μπορείς να μου πείς πως να του κάνω δύο αλλαγές?

1) Το file-001.jpg το κάνει file-35.jpg. Εγώ θέλω να το κάνει file-035.jpg (με το leading 0).
2) Μία παραλλαγή που να δουλεέυι και με διψήφια (πχ file-01.jpg να γίνεται file-35.jpg).

Δυστυχώς δεν το καταλαβαίνω ολόκληρο για να το αλλάξω εγώ.
Γνώσεις Linux: Μαθαίνω ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό


bobptz
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 659
Εγγραφή: 28 Δεκ 2012, 02:39
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό PapaNight » 24 Οκτ 2014, 16:00

Βεβαίως φίλε μου.
Παρατηρώ πως η bash έχει κάποια θεματάκια με αριθμούς που ξεκινούν με μηδενικά, δηλαδή δεν τους θεωρεί δεκαδικούς και ακόμα και αν την αναγκάσεις να τους αντιμετωπίσει ως δεκαδικούς το αποτέλεσμα το βγάζει χωρίς τα μηδενικά. Οπότε θα πρέπει να σου γράψω ένα ποιο πολύπλοκο σκριπτ που μάλλον θα πρέπει να μπει σε αρχείο κειμένου και να το τρέχεις έτσι. Κρίμα γιατί θα ήθελα να το καταλάβεις εύκολα και να ψηθείς με μια ωραία ασχολεία.

Κώδικας: Επιλογή όλων
#!/bin/bash
echo "Από ποιον αριθμό να ξεκινάει η τελευταία αρίθμηση;"
read start #διαβάζουμε τον αριθμό από τον οποίο θα ξεκινάμε την νέα αρίθμιση.
i="$(( 10#$start - 1 ))" #τον μειώνουμε κατα ένα σε μια νέα μεταβλητή (θα μπορούσαμε και στην ίδια). θα δούμε παρακάτω γιατί.
if (( $i < 10 )) ; then i=00$i ; elif (( $i < 100 )) ; then i=0$i ; fi  #προσθέτουμε μηδενικά για έιναι τριψήφιος
for file in *  #για κάθε αρχειο.. βάλε το όνομα του σε μια μεταβλήτη $file και
        do   #κανε τα παρακάτω
        i="$(( 10#$i + 1 ))" #αύξησε την $i κατά ένα. Η $i θα μετράει..
        if (( $i < 10 )) ; then i=00$i ; elif (( $i < 100 )) ; then i=0$i ; fi #να ξαναβάλουμε τα μηδενικά #μπροστά γιατί στις πράξεις χάνονται
        mv "$file" "${file:0:-7}$i".jpg #μετακίνησε το αρχείο $file σε .δες παρακάτω
        done #τέλως επανάληψης.. ξαναξεκινάμε από το done με το $file να έχει το επόμενο όνομα αρχείου.

Αν δε ξέρεις πως να το κάνεις πες μου και θα σου δόσω αναλυτικά οδηγείες.

Περί μακρυναριου "${file:0:-7}$i".jpg :

Στη bash $file είναι μια μεταβλητή με όνομα file. ${file:0:-7} είναι ένα κομμάτι της $file που ξεκινά από την αρχή (το πρώτο γράμμα ψηφίο) γιατί έχουμε 0 μετά τις πρώτες άνω και κάτω τελείες και σου αφαιρεί τους επτά τελευταίους χαρακτήρες γιατί μετά έχουμε -7. Επτά γιατί jpg + . (τελεία) + 001 (ή 002..) είναι εφτά χαρακτήρες και εμείς θέλουμε να τους αλλάξουμε (δε θέλουμε όλους αλλά είναι ποιο έυκολο να ξηλώσουμε κατι παραπάνω και να το βάλουμε μετά.)

Μετά έχουμε το $ι που είναι το νούμερο που του δώσαμε και το αυξάνουμε κάθε φορά που πιάνουμε αρχείο. Αυτό δηλαδή θα δίνει το διαφορετικό νούμερο σε κάθε αρχειο.

Και μετά είναι το .jpg που εφόσων το ξηλώσαμε παραπάνω πρέπει να το ξαναβάλλουμε στη θέση του (αν και το Λίνουξ δε μασάει από καταλήξεις!) Θα παρατηρήσεις οτι έκλεισα τα εισαγωγικά πριν το .jpg . Αυτό γιατί αλλιώς η bash δε θα νόμιζε πως η προγηούμενη μεταβλητή δεν είναι η $i αλλά η $i.jpg (που δεν υπάρχει) και φυσικά δε θα κολούσε και το .jpg

Επειδή γράφεις παραπάνω πως ψήθηκες για τον προγραμματισμό, εγώ θα σου προτείνω αντί pascal... την ίδια τη bash για εξάσκηση καθώς μαθαίνωντας μπορείς να βρίσκεις και εφαρμογές της σε ποιο καθημερινή χρήση.

ΑΛΛΑ μην ξεχνάς πως πειραματισμούς και .. εκμάθηση δεν κάνουμε πάνω στο λειτουργικό μας σύστημα ή στα σημαντικά μας αρχεία (σε αυτά τρέχουμε μόνο εντολές που καταλαβαίνουμε και τι κάνουν και γιατί θέλουμε να το κάνουν). Εξάλλου με τη bash είναι εύκολο να δημιοργείς ψευτικά αρχεία για πειραματισμούς :p
[url=http://mywiki.wooledge.org/BashGuide]Ορίστε[/code] και ένας κατά τη γνώμη μου πολύ καλός οδηγός για τη bash
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Αρχάριος ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 14.04, Windows 7
3 AMD Phenom II X6 1075T Processor ‖ RAM 16050 MiB ‖ ASRock 870 Extreme3
4 AMD nee ATI Cape Verde XT [Radeon HD 7770 GHz Edition] [1002:683d] {fglrx_pci}
5 eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06) ⋮ wlan1: Atheros Inc. AR922X Wireless Network Adapter [168c:0029] (rev 01)
PapaNight
babeTUX
babeTUX
 
Δημοσιεύσεις: 64
Εγγραφή: 23 Μαρ 2011, 22:51
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό bobptz » 24 Οκτ 2014, 20:30

PapaNight

Σε ευχαριστώ πάρα πολύ που ασχολήθηκες τόσο. Βέβαια εγώ μόλις είδα το σκριπτάκι ζαλίστηκα, σηκώθηκα, πήγα ήπια νερό και μετά κάθισα να το διαβάσω.

Ερωτήσεις:
Το fi τερματίζει το if, κάτι σαν endif, σωστά?
Αν το τρέξουμε, θα μετατρέψει το file-01.jpg σε file-035.jpg, σωστά?

Για πες τώρα, αν το βάλω σε ένα αρχείο που λέγεται πχ convertfilenames, μαζί με τα αρχεία μου. Απλά το τρέχω έτσι?
Κώδικας: Επιλογή όλων
#convertfilenames


Την pascal και το Delphi τα δούλεψα πολλά χρόνια, γι αυτό και επέλεξα αν χρειαστώ κάτι να τα φτιάξω στο lazarus. Ένα φρεσκάρισμα στη μνήμη θέλω και να δω πως δουλεύει το lazarus ( το οποίο δείχνει ίδιο με το delphi).
Γνώσεις Linux: Μαθαίνω ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό


bobptz
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 659
Εγγραφή: 28 Δεκ 2012, 02:39
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό PapaNight » 25 Οκτ 2014, 14:14

Μερικές ακόμα διευκρινήσεις.

Πράγματι το fi κλείνει κάθε if statement.

Στη δεύτερη απάντηση, όχι το σκριπτάκι θα σου κάνει το το file-01.jpg file035.jpg και αυτό γιατί έχεις βάλει μια παύλα. Προυπόθεση σου είπα είναι να τελιώνουν τα αρχεία σε τριψήφια κατάληξη, μια τελεία και τριψήφιο αριθμό. Γιατί για να κρατήσω ποιο απλό το σκριπτ, δεν ψάχνει να βρει που και πόσο μεγάλη είναι η αρίθμηση, αλλά σβήνει τα τελευταία 7 ψηφία και σε ότι μένει κοτσάρει ένα καινούργιο αριθμό και .jpg . Αν του δώσεις .png πάλι .jpg θα τα μετονομάσει καθότι το έφτιαξα επί της περιπτώσεως.

Μπορούν όμως αρκετά εύκολανα γίνουν μικροαλλαγές για να προσαρμόσεις το σκριπτ στα παραπάνω σενάρια.
Αν στο "${file:0:-7}$i".jpg στην προτελευταία γραμμή του κώδικα αλλάξεις το 7 σε 6 (προσοχή να παραμείνει το - μπροστά) θα σβήνει μόνο τους 6 τελευταίους χαρακτήρες και έτσι θα δουλέυει και με αρχεία αριθμημένα με 2 ψηφεία. Αν τα αρχεία σου αντί για .jpg είναι .png και θα ήθελες να παραμείνουν .png απλά στην ιδια γραμμή αλλάζεις το jpg σε png .

Το σκριπτακι έγινε λίγο ποιο πολύπλοκο γιατί κατα την bash 003 + 002 = 5 και όχι 005 για την ακρίβεια ότι νούμερο δει σε πράξη να έχει μηδενικό στην αρχή το κόβει αυτόματα για νούμερο γραμένο στην οκταδική (μέχρι το 07 όλα κομπλέ... μετα το 8 γράφεται 010 και το 9 011, μια οκτάδα και 0 και μια μονάδα αντίστοιχα). Για αυτό και πριν το $i έχω βάλει το πρόθεμα 10# όταν γίνονται αριθμητικές πράξεις για να 'αναγκάσω' τη bash να το δει ως δεκαδικά γραμμένο αριθμό. Για να μου βγάλει το αποτελεσμα με 'έξτρα μηδενικά' δεν βρήκα τόσο κομψό τρόπο και αναγκάστικα έχωσα από κάτω να βάλω μια γραμή να 'φουσκώνει' τα νούμερα σε τριψήφια με μηδενικά.

Για το πως τρέχουμε ένα μεγαλούτσικο σκριπτ από αρχείο στο linux:
1) Αντιγράφουμε το σκριπτ σε ένα απλό αρχείο κειμένου, έιτε στο gedit είτε σε όποιον παρόμοιο text editor μας βολέυει. Αν η πρώτη γραμμή δεν είναι ήδη #!/bin/bash την προσθέτουμε εμείς.
Το βασικό είναι να αποθηκεύτει ως απλό αρχείο κειμένου χωρίς μορφοποιήσεις κτλπ. Με το gedit απλα το επικολλείς και το αποθηκεύεις με τις default επιλογές. Το όνομα του αρχείου δεν παίζει ρόλο και οι καταλήξεις δεν παίζουν ρόλο στο linux αν θες πάντως πολλοι χρησιμοποιούν .sh από τον 'πρόγονο' της bash , sh .

2)Αφού έχουμε το σκριπτ (ως αρχείο κειμένου πλέον) όπου μας βολεύει στο τερματικό δίνουμε
Κώδικας: Επιλογή όλων
chmod +x script
όπου script είναι το όνομα που το αποθηκεύσαμε, μαζί με το path αν δεν είμαστε στον ίδιο φάκελο όταν τρέχουμε την εντολή.

3) Όταν θέλουμε να μετονομάσουμε τα αρχεία, τα μαζεύουμε σε ένα φάκελο ΜΟΝΑ ΤΟΥΣ (γιατί το σκριπτ μετονομάζει ΟΛΑ τα αρχεία σε ένα φάκελο) και ανοίγουμε ένα τερματικό στό οποιό και μεταβαίνουμε σε αυτό τον φάκελο (και όχι στον φάκελο με το σκριπτ)

4) Σε αυτόν το φάκελο λοιπόν τρέχουμε
Κώδικας: Επιλογή όλων
path/to/script
δηλαδή στο τερματικό γράφου απλά το πλήρες όνομα αρχείου. Δηλαδή αν το έχουμε χώσει σε ένα φάκελο σκριπτάκια μεσα στό home μας
Κώδικας: Επιλογή όλων
~/σκριπτάκια/script


5)Οποιοδήποτε σκριπτ μπορεί να δουλευτεί με τον ίδιο τρόπο, απλά μερικά όταν τα τρέχεις αφού δώσεις το path τους μπορεί να θέλουν arguments όπως αρκετά προγράμματα γραμμής εντολών. Αν είσαι στον φάκελο με το σκριπτ μπορείς να το τρέξεις απλά με το όνομα του αρχείου (χωρίς το path) απλά το συγκεκριμένο σκριπτ θα μετονομάσει και τον εαυτό του. Βεβαιά αυτό δεν το εμποδίζει να τρέξει οπότε αν φροντίσεις απλά το όνομα το να είναι μετά τα αρχεία σου μπορείς να το βάλεις και να το τρέξεις από τον ίδιο φάκελο και το αρχείο με το μεγαλύτερο νούμερο θα είναι το σκριπτ.

6)Αν φτιάξεις κάποιο σκριπτ και το χρησιμοποιείς σύχνα υπάρχουν αρκετοί τρόποι να το επικαλείσαι με απλά το όνομα του, μετακίνηση σε directory που βρίσκεται στο $PATH (όπως το /bin π.χ.), δημιουργεία νεου directory για τα δικά σου script και προσθήκη αυτού στο $PATH ή aliases (να γράφεις πχ xy και η bash να τρέχει ~/φάκελος/υποφάκελος/xy option1 --me tzatziki )

Ελπίζω να σε βοηθάω και να μη σε μπερδεύω χειρότερα. :)
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Αρχάριος ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 14.04, Windows 7
3 AMD Phenom II X6 1075T Processor ‖ RAM 16050 MiB ‖ ASRock 870 Extreme3
4 AMD nee ATI Cape Verde XT [Radeon HD 7770 GHz Edition] [1002:683d] {fglrx_pci}
5 eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06) ⋮ wlan1: Atheros Inc. AR922X Wireless Network Adapter [168c:0029] (rev 01)
PapaNight
babeTUX
babeTUX
 
Δημοσιεύσεις: 64
Εγγραφή: 23 Μαρ 2011, 22:51
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename  Το θέμα επιλύθηκε

Δημοσίευσηαπό konnn » 25 Οκτ 2014, 14:29

bobptz έγραψε:έψαξα και δε βρήκα κάποιο τρόπο να το κάνω. Εσείς ξέρετε κάποιον?


Υπάρχει το pyrenamer στο κέντρο λογισμικού.
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό bobptz » 27 Οκτ 2014, 21:49

konnn

Μου πήρε κανένα μισάωρο, αλλά κατάλαβα πως δουλεύει το pyrenamer. Δεν είναι τόσο έξυπνο όσο το σκριπτάκι του PapaNight, δηλαδή δε μπορεί να διαβάσει και να αυξήσει την αρίθμηση. Αλλά με σωστούς χειρισμούς έκανα αυτό που ήθελα.

Ευχαριστώ πολύ παιδιά!
Γνώσεις Linux: Μαθαίνω ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό


bobptz
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 659
Εγγραφή: 28 Δεκ 2012, 02:39
Εκτύπωση

Re: αλλαγή αρίθμισης στα filename

Δημοσίευσηαπό konnn » 27 Οκτ 2014, 23:52

bobptz έγραψε: Δεν είναι τόσο έξυπνο όσο το σκριπτάκι του PapaNight, δηλαδή δε μπορεί να διαβάσει και να αυξήσει την αρίθμηση


Αυτό γίνεται αν επιλέξεις κατάλληλες ρυθμίσεις μπορείς πχ τα αρχεία b.c, g.c να τα κάνεις πχ w1.c, w2.c κλπ..
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Επόμενο

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές Άλλες-Διάφορες

cron