2017-06-18 1 views
0

J'ai des dossiers organisés comme ceci:Comment exclure des sous-dossiers contenant "[xxx] - (aa) - [xxx]"

Folder1 
[xxx] - (aa) - [xxx] 
1.zip 
2.zip 
Folder2 
[xxx] - (bb) - [xxx] 
11.zip 
22.zip 

je dois:

  • aller dans tous les FolderX Décompressez les fichiers qu'il contient
  • journal si le fichier extrait n'a pas été extrait avec succès
  • déplacer le fichier extrait dans un autre dossier
  • journal si le fichier extrait n'a pas été déplacé avec succès Je ne veux pas le processus si quelque chose échoue.

je suis venu avec ce au début: "-maxdepth trouver 1 -type d"

for D in `find . -type d` 
do 
    cd $D 
    echo "$(pwd)" 
    for z in *.zip; do 
     unzip -u $z 
     echo "File: " $z; 
     if [ $? -eq 0 ] 
      then 
       echo "Successfully created file" 
      else 
       echo "Could not create file" >&2 
     fi; 
    done 
done 

J'ai essayé beaucoup de choses comme le remplacement par ou utiliser des tableaux, etc. "trouver -maxdepth 1." mais il y a toujours quelque chose qui échoue.

Mon principal problème, je pense que lorsque je tente:

$ find . -type d 

Je reçois ce résultat:

Folder1 
Folder1/[xxx] - (aa) - [xxx] 
Folder2 
Folder2/[xxx] - (bb) - [xxx] 

Mais quand j'utilise la même commande dans mes scripts il parse comme ça à la place:

Folder1 
[xxx] 
- 
( 
a 
) 
- 
[xxx] 
Folder2 
[xxx] 
- 
(
bb 
) 
- 
[xxx] 

Je n'ai jamais trouvé un moyen d'éviter le fractionnement du chemin à chaque espace ...

Des indices s'il vous plaît?

Merci à l'avance

+0

Désolé pour la mise en page pauvre, je suppose que je suis assez mal à utiliser ce ici ... – druid

+0

Prefix votre code/données avec quatre espaces blancs . Veuillez jeter un coup d'œil à [edit-help] (http://stackoverflow.com/editing-help). – Cyrus

+0

Merci, je lui ai donné un autre coup de feu et c'est mieux je suppose ... Citer ne marche pas très bien ... Ou au moins je n'utilise pas comme c'est censé être ici ... – druid

Répondre

1

Puisque vos répertoires contiennent des espaces blancs, la séparation de mots est effectuée sur eux (dans chaque ligne find retours). Voir une bonne explication de ce scénario (for boucle sur la liste des fichiers) sur la page bash pitfalls.

L'une des façons d'écrire votre boucle for extérieure est comme ceci:

find . -type d | while read D; do 
    cd "$D" 
    ... 
done 

Une autre approche, des actions plus simples, est d'utiliser simplement find avec l'action -execdir, comme ceci:

find . -name '*.zip' -execdir unzip -u '{}' \; 

Notez que nous utilisons l'action execdir qui exécute la commande dans le répertoire de fichiers, et non exec qui exécute le com mander dans le répertoire courant, car unzip extraits dans le répertoire actuel, sauf si le destinataire de la destination par l'option -d.

Ou en bash 4+, vous pouvez utiliser l'expansion récursive glob:

shopt -s globstar 
for z in ./**/*.zip; do 
    dir="$(dirname "$z")" 
    cd "$dir" 
    unzip -u "$z" && echo "OK" || echo "Failed to extract $z" 
done 

Aussi, ne pas oublier de (presque) toujours citer vos variables.

+0

Bonjour, merci beaucoup, "find. -type d | en lisant D; do" m'a mis en route, ça ne marche pas (bien que le script manque encore de plusieurs choses.) – druid

0

Le problème principal a maintenant été résolu grâce à randomir! Merci beaucoup!

C'est ce que je l'ai fait jusqu'à présent:

BASE=/path/to/my/stuff 

find . -type d | while read D 
do 
    EXTRACTED=0 
    if [[ ! "$D" =~ ^(.*)"[" ]] && [[ ! "$D" =~ ^\.$ ]] 
     then cd $BASE/$D 
      for z in *.zip 
      do 
      unzip -u $z 
       if [ $? -eq 0 ] 
        then 
         echo "ZIP SUCCESS - " $D"/"$z >> $BASE/details.log 
        else 
         echo "ZIP FAILED - " $D"/"$z >> $BASE/details.log 
         EXTRACTED=1 
       fi; 
      done 
     unrar x -o+ *.rar 
     if [ $? -eq 0 ] 
      then 
       echo "RAR SUCCESS - " $D >> $BASE/details.log 
      else 
       echo "RAR FAILED - " $D >> $BASE/details.log 
       EXTRACTED=1 
     fi; 

     if [ $EXTRACTED -eq 0 ] 
      then 
       echo "SUCCESS - " $D >> $BASE/main.log 
      else 
       echo "FAILED - " $D >> $BASE/main.log 
     fi; 
    fi; 
done 
+0

Un des autres défis auxquels je faisais face était que le script essayait d'accéder à "." ainsi que les autres sous-dossiers et il m'a fallu un certain temps pour comprendre qu'il pourrait facilement être résolu en assinant cela à mon if "&& [[!" $ D "= ~^\. $]]" pour gérer cela ... – druid

+0

Essayez '' find. -mindepth 1 -type d'' à la place.Il retournera seulement les sous-répertoires, en sautant le '' .''. – randomir

+0

Et ** s'il vous plaît ** [toujours citer vos variables] (http : //mywiki.wooledge.org/BashPitfalls) Par exemple, écrivez: '' cd '' $ BASE/$ D "' ',' 'unzip -u" $ z "' ',' 'echo" Succès - $ D/$ z "' '. – randomir