Comment utiliser 7z avec des variables dans un script linux?


1

Par exemple:

7za e -y $file_name -o$dest_directory

Cela fonctionne bien, lorsqu'il est exécuté directement à partir de la ligne de commande, mais dans le script, l'erreur suivante apparaît:

n'a pas trouvé d'archive (aucune archive portant ce nom).

J'ai essayé d'utiliser:

7za e -y `ls -a | grep 001` -o`pwd` 

Cela extrait les fichiers avec succès, mais les fichiers sont introuvables à la fin du script.


Pouvez-vous définir le problème un peu plus clairement - où trouvez-vous / définissez-vous $ nom_fichier et $ répertoire_destination? Qu'avez-vous l'intention de faire 7za e -yla | grep --1 -o pwd à faire? (Il me semble qu'il pourrait y avoir quelques backticks manquants - je me demande si SU les a
cueillis

Je me demande si votre problème pourrait être d'analyser $ nom_fichier et $ répertoire_dest dans le script. Je soupçonne que nom_fichier n'est pas exporté dans des sous-shell. (Pour ce faire, vous devez saisir export nom_fichier; exporter répertoire_dessin AVANT d'exécuter le script)
davidgo

@david go: vous avez raison, j'ai oublié de taper les symboles en arrière dans l'énoncé de mon problème. Vous trouverez ci-dessous le script que j'ai modifié. Cependant, il extrait les fichiers du répertoire - ./? . Comment résoudre ça? ! / bin / bash; printf "% s \ n" "Veuillez entrer le chemin complet de l'emplacement du fichier vmfile, par exemple / chemin / vers -"; lis ; vmfile_path = $ REPLY; cd $ vmfile_path; 7za e -y ls -a | grep 001 -o pwd;
Bhavya Maheshwari

Réponses:


2

Je copie + colle votre script à partir du commentaire ci-dessus avec des sauts de ligne ajoutés aux ;signes de lisibilité:

!/bin/bash
printf "%s\n" "Please enter full path to the vmfile location e.g. /path/to - "
read
vmfile_path=$REPLY
cd $vmfile_path
7za e -y ls -a | grep 001 -o`pwd`
  • Pour commencer, la première ligne devrait être le #!/bin/bashcas échéant, mais je suppose que c'est une faute de frappe.

  • Votre readcommande et la ligne suivante sont plus faciles à écrire read vmfile_path. De cette façon, le shebang pourrait également être modifié #!/bin/shcar vous n'utiliseriez aucune fonction spécifique à Bash.

  • Vous devriez citer l' cdargument pour gérer les noms de répertoire avec des espaces.

  • Je suppose que vous voulez extraire un fichier dont le nom contient la chaîne 001dans la dernière ligne. À l'heure actuelle, il manque un processus de substitution et votre intention est probablement plus proche de:

    7za e -y $(ls -a | grep 001) -o$(pwd)
    

    La $()syntaxe est plus facile à lire (et présente quelques autres avantages) par rapport aux backticks, mais elle fait la même chose.

    Je devinerais aussi que le répertoire de sortie utilise par défaut la pwdsortie, ce qui la rend superflue, mais je ne sais pas avec certitude.

  • Votre commande ne l’aimera pas s’il existe plus d’un nom de fichier correspondant 001.

En ignorant le dernier problème, vous voudriez au total quelque chose comme:

#!/bin/sh
printf '%s\n' "Please enter full path to the vmfile location e.g. /path/to - "
read vmfile_path
cd "$vmfile_path"
7za e -y "$(ls -a | grep 001)" -o"$(pwd)"

Ou, plus simplement, remplacez les deux dernières lignes par (gérera également plusieurs correspondances) (même si cela n’a pas été testé):

find "$vmfile_path" -maxdepth 1 -name '*001*' -exec 7za e -y -o"$vmfile_path" {} \;

Le modèle de correspondance de noms pourrait probablement être amélioré si vous connaissez davantage le nom de fichier.


Merci beaucoup. J'avais les problèmes parce que j'avais écrit le script dans l'éditeur de texte sous Windows et le scp'ed sur le serveur et que je l'exécutais. Les autres inefficacités du script consistaient également à contourner le problème, tel que printf, read puis var = read. J'ai réécrit tout le script en utilisant l'éditeur vi et tout fonctionne correctement maintenant. Merci quand même.
Bhavya Maheshwari
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.