J'ai un dossier contenant de nombreux dossiers avec sous-dossier (/ ...) avec la stratégie suivante: avec la commande 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? P> p> trouver. -Type D -Print | Grep '_ [0-9] * _' code> Tout dossier avec la structure ** em> sera affiché. Mais j'ai généré une regex qui ne capture que les dossiers * / combinés:
_ [0-9] * _ [AZ.] + / combiné code> mais lorsque j'insère à la commande de recherche, rien ne sera imprimé. P>
4 Réponses :
avec base ou vous pouvez utiliser la version "Extended Regexp" ( < Code> Xargs code> 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: p> aperçu manipulation de chaîne Bash Si vous souhaitez un moyen d'automatiser le nom de grep code> Vous devrez échapper au + code>: Egrep code> ou Grep -E code> [Merci Cheppner]) dans lequel le + code> ne doit pas être échappé. p> quelque_new_dir code>. P> P>
Si je fais echo $ $ combinés_dir code> 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.] \ +") Code> mais je ne travaille pas: (
Vous n'avez pas besoin de grep: pour le reste: p>
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]+
Vous pouvez utiliser cette commande:
find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"
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 i> 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)