μαζική μετονομασία αρχείων

hellaspc1 | Τρί, 07/13/2010 - 20:09 | 4' | 13

γεια σας παιδια θελω να κανψ μαζίκή μετονομασια αρχειων. βασικά θελω να φυγει η κατάληξη  σε πολλα αρχεία

εχουν κατάληξη  rar.html . βρηκα κατι πληροφρίες εδω




http://tips.webdesign10.com/how-to-bulk-rename-files-in-linux-in-the-te…

---

 




rename -v ’s/\.htm$/\.html/’ *.htm

 

The -v is optional, but it's a good idea to include it because it is the only record you will have of changes that were made by the rename command as shown in the sample output below:

$ rename -v 's/\.htm$/\.html/' *.htm

3.htm renamed as 3.html

4.htm renamed as 4.html

5.htm renamed as 5.html

 

The tricky part in the middle is a Perl substitution with regular expressions, highlighted below:

 

rename -v ’s/\.htm$/\.html/’ *.htm

 

Tip: There is an intro to Perl regular expressions here.

 

Basically the "s" means substitute. The syntax is s/old/new/ — substitute the old with the new.

 

A . (period) has a special meaning in a regular expression — it means "match any character". We don't want to match any character in the example above. It should match only a period. The backslash is a way to "escape" the regular expression meaning of "any character" and just read it as a normal period.

 

The $ means the end of the string. \.htm$ means that it will match .htm but not .html.

 

It's fairly basic — substitute .htm with .html:

 

's/\.htm$/\.html/'

 

The last part of the command, highlighted below, means to apply the rename command to every file that ends with .htm (the * is a wildcard).

 

rename -v ’s/\.htm$/\.html/’ *.htm

-------

 

 

αλλα σκεφτηκα να την συνδυασω με την find.

είμαι ειναι ήδη στον φακελο που ειναι τα αρχεία και λεω να βαλω το εξής

 find -type f -name '*rar.html' -exec reaname -v 's/\.html$/' *.rar  

σωστά το σκεφτηκα ή θα κάνω καμμια π@@@??

 

Δώσε αστέρια!

MO: 4 (ψήφοι: 1)

Σχόλια

Έχεις κ κάποια λάθη στη σύνταξη της εντολής, αλλά το βασικό λάθος είναι στην ιδέα. Κ να εξηγηθώ:

Αυτό που κάνει το find είναι να βρίσκει όλα τα αρχεία που του ζητάς, κ με την προσθήκη του "exec" να κάνει κάτι σε ΚΑΘΕΝΑ από αυτά.

Από την άλλη, η rename δέχεται σύνταξη παρόμοια με αυτή του "sed", κ ψάχνει επίσης για αρχεία, τα οποία κ μετονομάζει.

Κοινώς το πρόβλημα είναι ότι κ οι δύο ψάχνουν. Με άλλα λόγια, ζητάς από το σύστημα να ψάξει για κάποια αρχεία (find) κ για καθένα από αυτά να ψάξει κ να μετονομάσει όλα τα αρχεία (rename).

Κάτι πάει λάθος, ε;

Αντ'αυτού, τα πράγματα (εκ πρώτης) είναι πιο απλά αν θες να δουλέψεις με find: αφού το find σου παραδίδει ένα-ένα τα αρχεία που βρίσκει, αρκεί στο καθένα από αυτά να κάνεις μια απλή μετονομασία.

Στο linux, η βασική εντολή για μετονομασία είναι το mv:

mv παλιό_όνομα νέο_όνομα

Οπότε θα έγραφες κάτι σαν κ το ακόλουθο:

 find -type f -name '*rar.html' -exec mv ...

Αλλά κ πάλι πρόβλημα, αφού το find δεν μπορεί να επιστρέψει μέρος του ονόματος που βρίσκει, οπότε δεν μπορείς να δώσεις τα ονόματα που θες στη mv.

Οπότε, μια λύση είναι να αφήσεις το find απλά να βρει τα αρχεία (δοκίμασε να το τρέξεις χωρίς το exec κ όσα ακολουθούν μετά το exec, θα σου επιστρέψει μια λίστα με τα αρχεία που βρήκε, γραμμή-γραμμή), κ να αναλάβεις μόνος σου τη μετατροπή τους, μέσα σε ένα shell script, ως εξής:

#!/bin/bash

# παλιά κ νέα κατάληξη
OLDSUFFIX=".rar.html"
NEWSUFFIX=".html"

# βρες τα αρχεία κ κράτα τα στη μεταβλητή FILES_TO_RENAME
FILES_TO_RENAME=$(find -type f -name *$OLDSUFFIX)

# για καθένα από τα αρχεία που περιέχει το FILES_TO_RENAME...
for OLDFILE in $FILES_TO_RENAME; do
#αρχή του loop
# μέσα στο loop, το εκάστοτε αρχείο από τα FILES_TO_RENAME
# με το οποίο δουλεύουμε, λέγεται "OLDFILE"

# υπολόγισε το νέο όνομα, αφαιρώντας το παλιό suffix
# με την τεχνική "parameter expansion" του bash, κ
# προσθέτοντας το νέο suffix στο τέλος
NEWFILE=${OLDFILE%${OLDSUFFIX}}$NEWSUFFIX

# κάνε την μετονομασία κ τύπωσε στην οθόνη πληροφορίες
echo " Mετονομασία του $OLDFILE σε $NEWFILE"
# mv $OLDFILE $NEWFILE

#τέλος του loop
done

Προσπάθησα να βάλω κάποια σχόλια (γραμμές με # στην αρχή) για να εξηγήσω τι κάνει το script. Ρίξε μια ματιά, τρεξε το κ μερικές φορές να καταλάβεις τι κάνει κάθε γραμμή, πείραξε το, κ φυσικά ρώτα ό,τι θες.

Δύο βασικά πράγματα:

1) Πάνω-πάνω ορίζουμε τις καταλήξεις αρχείων, προσάρμοσε το όπως σου ταιριάζει.

2) H μετονομασία γίνεται στην τελευταία εντολή μέσα στο loop, με το mv όπως είπα κ προηγουμένως. Αυτή την εντολή την έχω με σχόλιο (#) μπροστά, οπότε δεν θα εκτελεστεί ποτέ. Το μόνο που κάνει το script είναι να τυπώνει τι ΘΑ έκανε. Αν δεις ότι σου κάνει, τότε βγάλε το # από τη γραμμή με το move κ θα κάνει κ το τελικό rename.

Όπως καταλαβαίνεις, η λύση που είχες βρει αρχικά (με την εντολή rename) ήταν ευκολότερη από αυτή εδώ. Απλά μιας κ ρώτησες ... :D

ΥΓ: Κάτι που με απασχόλησε εξ'αρχής... Γιατί δεν το δοκίμασες σε ένα προσωρινό φάκελο με δοκιμαστικά αρχεία (πχ αντίγραφα των κανονικών); Ειδικά στο linux (αλλά κ γενικότερα στη ζωή) μαθαίνεις μόνο δοκιμάζοντας κ σπάζοντας τα μούτρα σου. Θα έβλεπες έτσι ότι υπήρχε λάθος στην ιδέα σου. Ευτυχώς οι υπολογιστές είναι πολύ πιο απλοί από τη ζωή, κ κάνουν κ backup :P

-- gnu_labis

Το Linux ΔΕΝ είναι Windows!!!

φιλε μου ευχαριστω  για την απαντηση. το τελευταίο που ρωτησες, το σκεφτηκα μετα. δηλαδή εναν φακελο με 5 - 6 αρχεια κια βουρ για μετονομασια.

λοιπον οσον αφορά την αυτενέργεια που λες στο λινουξ θα κανω αυτο ( περιεργεια..) - το σκέφτηκα μετα απο την κοινοποίηση του προβληματισμού μου..

find -type f -name '*rar.html' > giametonomasia

και μετά

 

rename -v ’s/\rar.htm$/\.rar /’ *.rar.html < giametonomasia  

(ή κατι τετοιο. θα το περιρματιστω και θα σου πω)

 

οσο για την move  εχεις δικιο ετσι γινεται η μετονομασια.  θα κανω και καποιους συνδυασμους πριν κανω το κολπο σου.. (δεν ειμαι στον υπολογιστη μου)

http://www.tuxfiles.org/linuxhelp/fileman.html

απο δω ολα οκ

find -type f -name '*rar.htm' > giametonomasia

αλλα εδω εχει σφάλμα

rename -v ’s/\rar.htm$/\.rar /’ *.rar.htm < giametonomasia   
Unrecognized character \xE2 in column 1 at (eval 1) line 1.

-

θα δοκιμασω αλλιως και κατεβαζ ήδη το krename..

http://tips.webdesign10.com/how-to-bulk-rename-files-in-linux-in-the-terminal
 

Tip: To install Thunar on Ubuntu/Debian, type sudo apt-get install thunar in a terminal. To install Krename, type sudo apt-get install krename.

στο krename δεν εχω βρει τρπο να τα κανει όλα μαζί.. για να δουμε πειραματα κανω.. λοιπον.. με την μαζική του μετονομασια   βαζει π.χ.  στο αρχειο   1.rar.htm     ξανα το rar

δηλαδη 1.rarrar.htm  ενω θελω να φυγει το htm  ( πρπει να βρω τον τρόπο για φύγει το .html  την βλεπει σαν επεκταση γιαυτο κανει νερά..)

 

Συνήθως τη λύση τη βρίσκεις πιο έυκολα αν "σπάσεις το πρόβλημα".

Τι εννοώ; Ξεκίνα με τη rename μόνο, χωρίς find. Κάνε την να παίξει σωστά, ιδίως το μέρος που ορίζεις τί θέλεις να αλλάξει, κ σημείωσε τον τρόπο με τον οποίο ζητάει να της δώσεις τα αρχεία προς μετονομασία (tip: είτε μελέτα τι σημαίνει *.rar.htm κ με τι αντικαθίσταται όταν εκτελείς την εντολή, είτε κόψε το από την εντολή κ δώσε εσύ ένα-ένα τα αρχεία που θες να πειράξεις, για λίγα δείγματα φυσικά)..

Στη συνέχεια πιάσε τη find, κ παίξε μαζί της μέχρι να βγάζει τη λίστα με τα αποτελέσματα όπως ακριβώς τη θέλει η rename (tip: ίσως χρειαστεί να χρησιμοποιήσεις ένα απλό κ χρήσιμο εργαλείο, το xargs).

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

Όσο για το krename, φυσικά κ είναι ιδανική λύση, όπως κ το rename είναι πιο ιδανικό από το find & rename/move που θες να δοκιμάσεις, οπότε υποθέτω ότι την όλη κουβέντα τη κάνουμε για το χαβαλέ κ τη γνώση, σωστά;

Αν θες απλά να κάνεις τη δουλειά σου, εννοείται ότι ο δρόμος είναι το GUI. Παρεπιπτόντως, σε gnome/xfce υπάρχει το gprename κ μερικά άλλα αντίστοιχα προγραμματάκια αν έχεις gnome/xfce κ δε θέλεις να τραβήξεις τις εξαρτήσεις του KDE για να βάλεις το krename.

-- gnu_labis

Το Linux ΔΕΝ είναι Windows!!!

ναι παιδια ολη η φαση ειναι η γνωση.. καλο και το gui...  αλλα τι λινουξαδες ειμαστε?? ολα στο πιατο??? όσο για την rename  εχεις δικιο. θα κολουθησω την συμβουλή σου. πρωτα 

rename και μετα... find..

 σε τερματικο δινεις αυτο :

for f in *.html; do mv $f `basename $f .htm`.html; done;
 

και μετονομαζει όλα τα αρχεια  με την καταληξη  .html  σε  .html.html

το θεμα εινα  να αφαιρέσει το  html το πρωτο  δηλαδη απο  arxeio.rar.html  να γινει ετσι arxeio.rar

ο gnu_labis σωστα το δινει .. ελα και τελιωνουμε!!
 

http://www.fullinterview.com/phpkb/article/how-do-i-rename-*foo-to-*bar-or-change-file-names-to-lowercase-15058.html

 

ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh

ετσι στην δικια μου περιπτωση  γίνεται

 

ls -d *.htm | sed -e 's/.*/mv & &/' -e 's/htm$/rar/' | sh

αποτέλεσμα όλα τα αρχεια  της μορφης  arxeio.rar.htm

γινετια arxeio.rar.rar

μικρο το κακο..  αφπυ το βλεπι σαν rar  πια ... 

αντε και καλες μετονομασίες!!

ευχαριστω όσους είχαν την διαθεση και τον χρόνο να  συνεισφέρουν στην γνώση...

επαναλαμβανω

ls -d *.htm | sed -e 's/.*/mv & &/' -e 's/htm$/rar/' | sh

κια σε 2 δευτερολεπτα εγινε η μαζικη μετονομασία...

 

hellaspc1]

 σε τερματικο δινεις αυτο :

for f in *.html; do mv $f `basename $f .htm`.html; done;
 

και μετονομαζει όλα τα αρχεια  με την καταληξη  .html  σε  .html.html

το θεμα εινα  να αφαιρέσει το  html το πρωτο  δηλαδη απο  arxeio.rar.html  να γινει ετσι arxeio.rar

ο gnu_labis σωστα το δινει .. ελα και τελιωνουμε!!
 

Βρήκες κ το basename ε; ωραίος :)

Βασικά μπερδεύτηκα, το αρχικό ζητούμενο ήταν να μετονομάσεις .rar.html σε .html, .rar.html σε .rar, ή κάτι άλλο;

Αν θες να μετονομάσεις .rar.html σε σκέτο .rar, τότε το κάνεις λάθος.

Καταρχήν, πρέπει να ψάξεις για *.rar.html, κ όχι μόνο html, ώστε να αποφύγεις να πειράξεις άλλα τυχόν αρχεία.

Κατά δεύτερον, αν θες το basename να αφαιρέσει την κατάληξη .html, πρέπει να τη δώσεις όλη: .html, κ όχι .htm

Κατά τρίτον, αν θες απλά να κρατήσει το .rar, τότε μετά την εντολή basename μη βάλεις τίποτε άλλο.

Για να το καταλάβεις το τελευταίο, φτιάξε ένα πρόχειρο αρχείο με όνομα temp.rar.html κ δώσε τα ακόλουθα (ένα-ένα) να δεις τι σου επιστρέφει:

basename temp.rar.html .html
basename temp.rar.html html
basename temp.rar.html .rar.html
basename temp.rar.html .htm

και,

echo `basename temp.rar.html .html`
echo `basename temp.rar.html .html`.html

Έτσι η εντολή σου γίνεται:

for f in *.rar.html; do mv $f `basename $f .html`; done

Το πρόβλημα με αυτό τον τρόπο είναι ότι δουλεύει μόνο στο φάκελο που το τρέχεις, δεν θα ψάξει κ υποφακέλους, αλλά ακόμα κ αν έψαχνε, η εντολή basename "τσεκουρώνει" το prefix (το που βρίσκεται το αρχείο). Πχ, αν είχες ένα αρχείο temp.rar.html στον υποφάκελο testdir, κ είχες κ τρόπο να συμπεριληφθεί στο for loop (πχ όπως το έκανα εγώ στο script μου) τότε ουσιαστικά η εντολή σου θα έκανε το εξής:

mv testdir/temp.rar.html temp.rar

το οποίο ναι μεν θα έκανε τη μετονομασία, αλλά ταυτόχρονα θα μετέφερε το αρχείο ένα φάκελο πιο πάνω (εκεί που εκτέλεσες την εντολή).

Οπότε λογικά δουλεύει, αλλά μόνο όταν όλα τα αρχεία σου είναι σε ένα φάκελο.

-- gnu_labis

Το Linux ΔΕΝ είναι Windows!!!

ναι ολα τα εχω σε ενα φάκελο ( χύμα desktop)  τα αρχεια ηταν συμπιεμενα, αλλά εοχαν κατάληξη .html     συγκεκριμενα  .rar.html  .

Και συμφωνα με την κατάληξη  .html  ενω ειναι συμπιεσμενο αρχειο rar,   το βλεπει σαν αρχειο  html. 

Οπότε έπρεπε να φύγει το τελευταιο  - το .html  δηλαδη.  και να μεινει ως .rar 

έχω κανει την μετονομασια ήδη.  δεν νομιζω να πειραξα αλλα html  αρχεια  γιατι ηταν στο  desktop.  αρα είδε μόνο όσα ηταν στο desktop  και είχαν καταληξη μόνο .html ...

 βασικα η basename  δεν μου εκανε ... ( δεν ηξερα να την χρησιμοποιήσω- ηθελε και άλλο ψαξιμο..)  οπτε την εκανα με ls ....... κλπ

 

 

Πως μπορούμε να κάνουμε μαζική μετονομασία αλλά όχι στην κατάληξη μέσα στο όνομα.

Πχ έχουμε τα αρχεία

Chapter1.pdf,

Chapter2.pdf

........

ktl ...ktl..
 

πως τα κάνουμε μαζική μετονομασία σε

Chapter01.pdf

Chapter02.pdf

ktl  ktl