Βάζετε φερμουάρ σε όλα τα αρχεία του καταλόγου;

Υπάρχει τρόπος να συμπιέσετε όλα τα αρχεία ενός συγκεκριμένου καταλόγου με την εντολή zip; Έχω ακούσει για τη χρήση του *.*, αλλά θέλω να λειτουργεί και για αρχεία χωρίς επέκταση.

Λύση

Μπορείτε απλά να χρησιμοποιήσετε το *- δεν χρειάζεται το *.*. Οι επεκτάσεις αρχείων δεν είναι ειδικές στο Unix. Το * ταιριάζει με μηδέν ή περισσότερους χαρακτήρες-συμπεριλαμβανομένης της τελείας. Έτσι, ταιριάζει με το foo.png, επειδή αυτό είναι μηδέν ή περισσότεροι χαρακτήρες (επτά, για την ακρίβεια).

Σημειώστε ότι το * από προεπιλογή δεν ταιριάζει με αρχεία που αρχίζουν με τελεία (ούτε το *.*). Αυτό είναι συχνά αυτό που θέλετε. Αν όχι, στο bash, αν κάνετε shopt -s dotglob θα το κάνει (αλλά θα εξακολουθεί να αποκλείει τα . και ..). Άλλα κελύφη έχουν διαφορετικούς τρόπους (ή καθόλου) για να συμπεριλάβουν τα dotfiles.

Εναλλακτικά, το zip έχει επίσης την επιλογή -r (αναδρομική) για να κάνετε ολόκληρα δέντρα καταλόγων με τη μία (και να μην χρειάζεται να ανησυχείτε για το πρόβλημα των dotfile):

zip -r myfiles.zip mydir

όπου mydir είναι ο κατάλογος που περιέχει τα αρχεία σας. Σημειώστε ότι το παραγόμενο zip θα περιέχει τη δομή καταλόγου καθώς και τα αρχεία. Όπως επισημαίνει ο peterph στο σχόλιό του, αυτό συνήθως θεωρείται καλό: η εξαγωγή του zip θα αποθηκεύσει όλα τα αρχεία που εξήχθησαν σε έναν υποκατάλογο.

Μπορείτε επίσης να πείτε στο zip να μην αποθηκεύει τα μονοπάτια με την επιλογή -j/--junk-paths.

Η εντολή zip έρχεται με τεκμηρίωση που σας λέει για όλες τις (πολλές) επιλογές της- πληκτρολογήστε man zip για να δείτε αυτή την τεκμηρίωση. Αυτό δεν ισχύει μόνο για τη zip- μπορείτε να βρείτε τεκμηρίωση για τις περισσότερες εντολές με αυτόν τον τρόπο.

Σχόλια (16)

Στην περίπτωσή μου ήθελα να βάλω το zip κάθε αρχείου στο δικό του αρχείο, οπότε έκανα τα εξής (στο zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
Σχόλια (3)

Ένας άλλος τρόπος θα ήταν να χρησιμοποιήσετε το find και το xargs: (αυτό μπορεί να περιλαμβάνει έναν κατάλογο "." στο zip, αλλά θα πρέπει να εξαχθεί σωστά. Με τη δοκιμή μου, το zip αφαίρεσε την τελεία πριν από τη συμπίεση) find . -type f -exec zip zipfile.zip {} +

(Το + μπορεί να αντικατασταθεί με \; αν η έκδοση του find σας δεν υποστηρίζει το τέλος + για exec. Θα είναι όμως πιο αργή...)

Αυτό από προεπιλογή θα συμπεριλάβει όλους τους υποκαταλόγους. Στο GNU find το -maxdepth μπορεί να το αποτρέψει αυτό.

Σχόλια (1)