Si je choisis un fichier Zip et que je fais un clic droit "extraire ici", un dossier avec le nom du fichier Zip est créé et tout le contenu du fichier Zip y est extrait.
Cependant, je voudrais convertir plusieurs fichiers Zip via Shell. Mais quand je fais
unzip filename.Zip
le dossier "filename"
n'est pas créé mais tous les fichiers sont extraits dans le répertoire courant.
J'ai regardé les paramètres mais il n'y a pas un tel paramètre. J'ai aussi essayé
for zipfile in \*.Zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done
mais le .Zip
l'extension du 2. $ zipfile et du 4. $ zipfile doit être supprimée avec sed. Si je fais
for zipfile in \*.Zip; do mkdir sed 's/\.Zip//i' $zipfile; unzip $zipfile -d sed 's/\.Zip//i' $zipfile/; done
ça ne marche pas.
Comment remplacer le .Zip
extension de $zipfile
correctement?
Existe-t-il un moyen plus simple qu'un script Shell?
"extraire ici" est simplement une fonction du wrapper unzip
que vous utilisez. unzip
extraira uniquement ce qui se trouve réellement dans l'archive. Il n'y a probablement pas de moyen plus simple qu'un script Shell. Mais sed
, awk
etc. ne sont pas nécessaires pour cela si vous avez un shell compatible POSIX:
for f in *.Zip; do unzip -d "${f%*.Zip}" "$f"; done
(Vous NE DEVEZ PAS échapper au *
ou l'extension du nom de chemin n'aura pas lieu.) Sachez que si l'archive Zip contient un répertoire, comme avec les archives Eclipse (qui contiennent toujours Eclipse/
), vous vous retrouvez avec ./Eclipse*/Eclipse/eclipse.ini
dans tout les cas. Ajoutez echo
avant unzip
pour un essai à sec.
unzip file.Zip -d xxx
extraira les fichiers dans le répertoire xxx et xxx sera créé s'il n'y est pas. Vous pouvez consulter la page de manuel pour plus de détails.
La ligne awk ci-dessous devrait faire le travail:
ls *.Zip|awk -F'.Zip' '{print "unzip "$0" -d "$1}'|sh
Voir le test ci-dessous,
note que j'ai supprimé |sh
à la fin, car mes zips sont de fausses archives; Je veux juste montrer la ligne de commande générée ici.
kent$ ls -l
total 0
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.Zip
kent$ ls *.Zip|awk -F'.Zip' '{print "unzip "$0" -d "$1}'
unzip 001.Zip -d 001
unzip 002.Zip -d 002
unzip 003.Zip -d 003
unzip 004.Zip -d 004
unzip 005.Zip -d 005
unzip 006.Zip -d 006
unzip 007.Zip -d 007
Si vous avez p7Zip, la version en ligne de commande de 7Zip installée, vous pouvez utiliser:
7z x '*.Zip' -o'*'
Ajoutez le nom du dossier et la barre oblique après le commutateur, par exemple:
unzip -d newfolder/ zipfile.Zip
Zip créera le dossier 'newfolder' et y extraira l'archive.
Notez que la barre oblique de fin n'est pas requise, mais je suppose que cela vient de la vieille habitude (j'utilise Debian et Ubuntu).
aunpack
de atool le fera par défaut pour toutes sortes d'archives.