Bash: Copier une liste de fichiers contenant (beaucoup) de caractères spéciaux

0

Je sais très bien comment copier simplement une liste de fichiers vers un autre emplacement à l'aide de bash, mais le problème est que ma liste de fichiers contient des noms de fichiers contenant à peu près TOUS les caractères à échapper dans bash. Il y a des tonnes d'espaces!, ",", "",?, Et à peu près tous les autres personnages auxquels vous pourriez penser doivent être évités.

Au début, j'étais fatigué de parcourir le fichier texte et d'échapper à tous ces caractères, mais c'est ... épuisant, même avec la recherche et le remplacement (même si ça marche) (je l'ai testé avec une liste de fichiers beaucoup plus petite.) des guillemets dans le fichier texte avant et après le chemin, mais cela ne fonctionne pas. J'ai également essayé d'ajouter des guillemets simples après les% après cp, mais je n'ai évidemment aucune idée de ce que je fais. :) (Je sais que je devrais échapper aux guillemets simples dans le fichier texte si je devais en quelque sorte entourer le chemin du fichier avec des guillemets simples.)

J'utilise cette commande pour copier la liste de fichiers dans un autre emplacement, mais là encore, cela ne fonctionne pas avec les caractères spéciaux.

cat file.txt | xargs -J % cp % ./folderToMoveto/

Je sais qu'il y a d'autres commandes qui font la même chose sans rien imputer à xargs, et certaines réponses disent que xargs peut le faire tout seul, mais je n'ai pas réussi à les faire fonctionner, alors que celle ci-dessus fonctionne.

De plus, je suis sous OS X.

utilisateur2634928
la source

Réponses:

1

GNU xargs a une -0option lui permettant de lire des données délimitées par un octet nul. Sous Linux, vous pouvez faire:

tr '\n' '\0' < file.txt | xargs -0 cp -t /folder/to/move/to

Malheureusement, Apple a mis hors-ligne son ancien site de pages de manuel Darwin. Je ne peux donc pas vérifier s’il existe un équivalent de MacOS.

Glenn Jackman
la source
Vous pouvez trouver la documentation en ligne pour les commandes MacOS à l'adresse https://ss64.com/osx/. Sur la page d'accueil, https://ss64.com/vous trouverez la documentation d'un certain nombre d'environnements de script.
AFH
Honnêtement, les espaces (octets nuls) ne sont pas vraiment le problème. Le problème réside dans le reste des 20 caractères à échapper. Je peux résoudre le problème d'espace avec une simple recherche et remplacer. Je cherche un moyen d'ajouter des guillemets simples à la commande xargs afin de ne pas avoir à m'inquiéter d'échapper à autre chose qu'à une citation. (Ou suis-je stupide et ne comprends pas votre réponse?)
user2634928
Je ne comprends pas pourquoi vous devez vous échapper avec cette recette. Pouvez-vous couper et coller vos tentatives dans la question?
Glenn Jackman
@ user2634928 afin -0de xargs -0 vous assurer qu'aucun caractère ne nécessite un traitement particulier, car seul \0le nom de fichier sera pris à la fin du nom de fichier, tout le reste sera utilisé tel quel . xargs n'utilise pas le shell et appelle cpdirectement en lui passant le nom du fichier tel quel avec tous les caractères qui auraient nécessité un traitement spécial dans le shell.
Patrick Mevzek
@glennjackman Que voudriez-vous que je copie et colle? Lorsque j'essaie mon code d'origine avec un fichier texte brut avec un chemin complet sur chaque ligne, CP trébuche d'abord sur les espaces, puis lorsque j'échappe les espaces, CP trébuche sur tous les autres mauvais caractères (!,?,, , ', ", etc.) En ce qui concerne votre solution, os X cp ne dispose pas de l'option -t, ni rien de similaire.
user2634928