7
votes

Bash - Recherchez un dossier spécifique avec Rechercher et filtrer avec regex

J'ai un dossier contenant de nombreux dossiers avec sous-dossier (/ ...) avec la stratégie suivante: xxx

avec la commande trouver. -Type D -Print | Grep '_ [0-9] * _' Tout dossier avec la structure ** sera affiché. Mais j'ai généré une regex qui ne capture que les dossiers * / combinés: _ [0-9] * _ [AZ.] + / combiné mais lorsque j'insère à la commande de recherche, rien ne sera imprimé.

L'étape suivante serait de Créez un dossier pour chaque dossier combiné (quelque part sur mon disque dur) et copiez le contenu du dossier combiné dans le nouveau dossier. Le nouveau nom de dossier doit être identique au nom de parent du sous-dossier par ex. _47_foo.bar. Cela pourrait-il être atteint avec une commande xargs après la recherche?


5 commentaires

Si vous insérez votre regex dans l'option Regex à la recherche d'être consciente que la recherche correspond au chemin complet -> Si vous commencez. Ensuite, la regex doit correspondre ./whatever/come.here.


Cela semble suspicieusement comme un XY Problème . MyBecks, qu'est-ce que tu es vraiment essayer d'atteindre?


Est-il possible de dire que cela ne devrait rechercher que dans ce répertoire (ou prédéfini) et bien sûr dans tous les sous-résidents


@mybecks ... mais n'est-ce pas ce que vous racontez avec le tout premier argument


J'avais pensé que, mais réalisa que tous les dossiers avec cette nommage sont trouvés (et supprimés, j'utilise cette commande de recherche pour supprimer trop)


4 Réponses :


4
votes

avec base grep Vous devrez échapper au + : xxx

ou vous pouvez utiliser la version "Extended Regexp" ( Egrep ou Grep -E [Merci Cheppner]) dans lequel le + ne doit pas être échappé.

< Code> Xargs n'est peut-être pas le moyen le plus flexible de faire la copie que vous décrivez ci-dessus, car il est difficile d'utiliser avec multiple Commandes . Vous trouverez peut-être plus de flexibilité avec une boucle tandis que: xxx

aperçu manipulation de chaîne Bash Si vous souhaitez un moyen d'automatiser le nom de quelque_new_dir .


1 commentaires

Si je fais echo $ $ combinés_dir Il imprime l'ensemble du chemin ./_00_foo.bar/commined. C'est d'accord. Mais maintenant, je veux copier le contenu de / combiné à la Dir principal (_00_foo.bar). Par conséquent, j'ai utilisé la syntaxe suivante à l'intérieur de la boucle: actuel_dir = $ (echo $ combinés_dir | grep "_ [0-9] * _ [AZ.] \ +") mais je ne travaille pas: (



8
votes

Vous n'avez pas besoin de grep: xxx

pour le reste: xxx


0 commentaires

1
votes
target_dir="your target dir"

find . -type d -regex ".*_[0-9]+_.*/combined" | \
  (while read s; do
     n=$(dirname "$s")
     cp -pr "$s" "$target_dir/${n#./}"
   done
  )
NOTE:
this fails if you have linebreaks "\n" in your directory names
this uses a subshell to not clutter your env - inside a script you don't need that
changed the regex slightly: [0-9]* to [0-9]+

0 commentaires

0
votes

Vous pouvez utiliser cette commande:

find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"


0 commentaires