Υπάρχει τρόπος να συμπιέσετε όλα τα αρχεία ενός συγκεκριμένου καταλόγου με την εντολή 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- μπορείτε να βρείτε τεκμηρίωση για τις περισσότερες εντολές με αυτόν τον τρόπο.
Στην περίπτωσή μου ήθελα να βάλω το zip κάθε αρχείου στο δικό του αρχείο, οπότε έκανα τα εξής (στο zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Ένας άλλος τρόπος θα ήταν να χρησιμοποιήσετε το find και το xargs: (αυτό μπορεί να περιλαμβάνει έναν κατάλογο "." στο zip, αλλά θα πρέπει να εξαχθεί σωστά. Με τη δοκιμή μου, το zip αφαίρεσε την τελεία πριν από τη συμπίεση)
find . -type f -exec zip zipfile.zip {} +
(Το +
μπορεί να αντικατασταθεί με \;
αν η έκδοση του find
σας δεν υποστηρίζει το τέλος +
για exec. Θα είναι όμως πιο αργή...)
Αυτό από προεπιλογή θα συμπεριλάβει όλους τους υποκαταλόγους. Στο GNU find το -maxdepth
μπορεί να το αποτρέψει αυτό.