Existe-t-il un moyen de désactiver wget pour obtenir des fichiers des répertoires parents à une profondeur donnée?

11

wget a une telle option -npqui désactive la récupération de fichiers depuis n'importe quel répertoire parent. J'ai besoin de quelque chose de similaire mais un peu plus flexible. Considérer:

www.foo.com/bar1/bar2/bar3/index.html

Je voudrais tout obtenir, mais pas "plus haut" (dans la hiérarchie arborescente) que bar2(!). Il bar2faut donc aussi aller le chercher mais pas bar1.

Existe-t-il un moyen de rendre wget plus sélectif?

Contexte: J'essaie de refléter un site Web, avec une structure logique similaire - point de départ, puis haut, puis bas. S'il existe un autre outil que wget, mieux adapté à une telle disposition, faites-le moi savoir également.

Mise à jour

Ou au lieu de spécifier une profondeur possible, peut-être quelque chose comme "pas de parents, sauf s'ils correspondent à telle ou telle URL".

Update 2

Il y a une certaine structure sur le serveur, non? Vous pouvez le visualiser sous forme d'arbre. Donc normalement avec "--no-parent" vous commencez à partir d'un point A et descendez seulement.

Mon souhait, c'est la capacité de monter - exprimée en disant, il est permis de monter X nœuds, ou (ce qui est 100% équivalent) qu'il est autorisé de monter jusqu'au nœud B (où la distance BA = X).

Dans tous les cas, les règles de descente restent telles que définies par les utilisateurs (par exemple - descendre uniquement par niveaux Y).

Comment le conserver? En fait, ce n'est pas vraiment la question - wgetpar défaut recrée la structure du serveur, il n'y a rien à craindre ici, ou il n'y a pas besoin de réparer quoi que ce soit. Donc, en 2 mots - comme d'habitude.

Mise à jour 3

Structure du répertoire ci-dessous - supposons que dans chaque répertoire, il n'y ait qu'un seul fichier, dans R-R.html et ainsi de suite. Ceci est bien sûr simplifié car vous pouvez avoir plus d'une page.

        R 
       / \
      B   G
     / \
    C   F
   / \
  A   D
 /
E 

A (A.html) est mon point de départ, X = 2 (donc B est le nœud le plus haut que je voudrais récupérer). Dans cet exemple particulier, cela signifie récupérer toutes les pages sauf R.html et G.html. A.html est appelé "point de départ" car je dois partir de lui, pas de B.

Mise à jour 4

La dénomination est utilisée à partir de la mise à jour 3.

OPTIONS wget www.foo.com/B/C/A/A.html

La question est de savoir quelles sont les options pour obtenir toutes les pages du répertoire B et inférieur (sachant que vous devez commencer à partir de A.html).

greenoldman
la source
Vous voulez bar2aller chercher mais pas bar1? Où bar2va résider? Que se passe-t-il si deux répertoires ou plus que vous ne voulez pas ont des sous-répertoires de même nom, si leur contenu doit être fusionné? Il est presque certainement plus facile d'obtenir tout le putain de site et de tailler / déplacer les choses comme vous le souhaitez.
Kilian Foth,
@Kilian Foth, que voulez-vous dire par "obtenir tout ce putain de site"? Le chercher? En général, c'est exagéré, cela pourrait signifier aller chercher des TB lorsque des MB sont nécessaires. Pour le reste, voir update2.
greenoldman
Pas sûr de ce que vous voulez dire. La seule interprétation que je peux proposer est que vous voulez le bar2répertoire et tout son contenu. Si ce n'est pas le cas, veuillez clarifier.
Faheem Mitha
@Faheem Mitha, "its content" = "sous-arbre entier". Oui, ce n'est qu'une interprétation, je crois, et c'est exactement ce que je veux dire.
greenoldman

Réponses:

12

Je ne l'ai pas essayé, mais utiliser -I et -X pourrait vous donner ce que vous voulez. Mes premiers essais iraient dans le sens de

wget -m -I bar1/bar2 -X "*" http://www.foo.com/bar1/bar2/bar3/index.html

Explication des options:

-m: 
   --mirror
       Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets
       infinite recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l
       inf --no-remove-listing.
-I: list
   --include-directories=list
       Specify a comma-separated list of directories you wish to follow when downloading.  Elements of
       list may contain wildcards.
-X: list
   --exclude-directories=list
       Specify a comma-separated list of directories you wish to exclude from download.  Elements of list
       may contain wildcards.
AProgrammer
la source
4

Vous devez ajouter un final / à l'URL, sinon vous n'obtiendrez pas ce que vous voulez.

Si vous souhaitez obtenir tout le contenu sur www.myhostname.com/somedirectory, la syntaxe doit se lire comme suit:

wget -r -nH http://www.myhostname.com/somedirectory/

Essayez-le sans la fin / et voyez ce qui se passe. Essayez ensuite avec le /.

Adrian
la source
1
Il montera toujours dans les répertoires supérieurs si les pages qui y sont liées s'y réfèrent
EkriirkE
Merci beaucoup pour l'astuce avec barre oblique de fin! Cela m'a aidé à résoudre le problème avec les fichiers non pertinents récupérés par wget dans les répertoires voisins (frères et sœurs).
AntonK
4

Je pense que la bonne réponse ici est l' --no-parentoption:

   -np
   --no-parent
       Do not ever ascend to the parent directory when retrieving recursively.
       This is a useful option, since it guarantees that only the files below
       a certain hierarchy will be downloaded.
Jonathon Reinhart
la source
Ce drapeau est exactement l'opposé de ce que veut OP
EkriirkE
1

Peut-être que je manque quelque chose, mais si c'est ce que tu veux alors

wget -c -np -r www.foo.com/bar1/bar2

fonctionne pour moi (en utilisant votre exemple). Bien sûr, avec ces options, vous obtiendrez toute la structure de répertoires au-dessus de cela, de www.foo.combas en haut. Si vous voulez juste bar2au plus haut niveau, alors faites

wget -c -np -r -nH --cut-dirs=1 www.foo.com/bar1/bar2

-nHse débarrasse de www.foo.com, et --cut-dirs=1se débarrasse de bar1, donc vous obtiendrez bar2et ses sous-répertoires téléchargés dans le répertoire courant. Pour plus d'informations, voir man wget, qui est assez lisible et contient des exemples.

Faheem Mitha
la source
Vous avez omis le point de départ, vous devez suivre les liens. Vous avez supposé que le point de départ est en même temps de niveau supérieur (c'est un cas trivial np), mais je cherche une solution générale, lorsque le niveau supérieur est au-dessus du point de départ.
greenoldman
@macias: Désolé, je ne vous suis pas. Pouvez-vous illustrer avec un exemple?
Faheem Mitha
Je viens d'ajouter une "capture d'écran" ASCII. J'espère que cela vous aidera. Dans cet exemple, A est le point de départ.
greenoldman
@macias: Donc, vous ne voulez pas spécifier le chemin d'accès B(selon votre exemple), mais plutôt A? Si oui, pourquoi? Est-ce parce que vous souhaitez automatiser un script ou pour une autre raison? Je ne sais pas non plus ce que vous entendez par X = 2. Est-ce que cela signifie le niveau 2? Si vous essayez de chercher des répertoires plus bas dans l'arbre, je ne sais pas comment vous distinguez Bde G.
Faheem Mitha
A est le point de départ, car c'est le point de départ - regardez, je suis du côté client, pas un serveur. IOW - Je ne possède PAS le serveur et je n'ai pas créé cette structure. Je dois faire face à ce que je vois. X est le symbole de la mise à jour 2, la "profondeur" du nombre de niveaux que vous pouvez monter. Vous distinguez B de G, car B est B, et G n'est pas B, et vous voyez B, car il fait partie de l'URL pour A. J'ai reformulé la question dans la mise à jour 4.
greenoldman