J'essaye de copier des images sélectionnées par une expression REGEX via find
. La commande ci-dessous s'exécute mais ne copie pas les fichiers. Comment puis-je passer une variable de boucle (par exemple la lecture de lignes d'un fichier) à l'argument find -regex?
".*B - 12.*tif" ".*D - 09.*tif" ".*G - 03.*tif" ".*G - 12.*tif" ...
Le fichier hit_images_regex_list.txt
dans lequel je tire REGEX expressions de ressemble à ceci:
cat hit_images_regex_list.txt | while read line; do find . -regex "${line}" -exec cp --parents {} /destination_dir \; done
L'utilisation de find
avec chacune de ces expressions REGEX fonctionne, mais la boucle tirant les expressions REGEX de mon fichier .txt ne fonctionne pas ne fais rien.
3 Réponses :
for i in $(cat hit_images_regex_list.txt); do find -name "$i" | cat -n | while read n f; do cp "$f" /newfolder/path/"$n".tig; done; done this should open the file and for each regex (line) find all files that match and copy to a new folderdoes this help
Essayez ceci.
while IFS= read -r line; do find . -regex "$line" -exec cp --parents {} /destination_dir \; done < hit_images_regex_list.txt
Les gens ont pris le temps d'essayer d'aider. Veuillez noter nos réponses de politesse
Le problème, ce sont les guillemets dans le fichier; ils ne sont pas destinés à faire partie de l'expression régulière. Vous devez simplement les supprimer du fichier.
N'ai-je pas besoin d'avoir les guillemets pour protéger l'espace blanc autour du tiret?
Non; c'est à cela que servent les guillemets dans la ligne de commande,
-regex "$ line"
vs-regex $ line
.Merci, cela a fonctionné après avoir effectué un ajustement sur le fichier REGEX. Le problème que j'avais était que le fichier .txt avait été créé sous Windows et avait des marqueurs de fin de ligne incorrects. J'ai utilisé
dos2unix
pour le réparer.