J'ai eu une réponse gênante à propos de ce sujet plus tôt, mais la réponse de Denis m'a rappelé que j'avais raté la chose la plus élémentaire. J'ai donc supprimé ma réponse d'origine. Mais puisque personne n'a dit cette chose très basique, je pense que cela vaut la peine de la mettre ici.
La question d'origine est "J'ai un fichier texte avec une liste de noms de fichiers séparés par des espaces. Comment puis-je les copier dans un répertoire cible." Au début, cela peut sembler délicat ou compliqué, car vous pensez que vous devez en quelque sorte extraire les éléments du fichier d'une manière spécifique. Cependant, lorsque le shell traite une ligne de commande, la première chose qu'il fait est de séparer la liste des arguments en jetons et (voici le bit que personne n'a dit carrément) des espaces séparent les jetons . (Les nouvelles lignes séparent également les jetons, c'est pourquoi le test de Doug Harris avec une liste séparée par les nouvelles lignes a eu le même résultat.) Autrement dit, le shell attend et peut déjà gérer une liste séparée par des espaces.
Donc, tout ce que vous devez faire ici est de mettre la liste séparée par des espaces (que vous avez déjà) au bon endroit dans votre commande. Votre commande est une variation à ce sujet:
cp file1 file2 file3...file# target
Le seul inconvénient est que vous souhaitez obtenir la liste des fichiers 1 à # à partir de votre fichier texte.
Comme Dennis le souligne dans son commentaire, votre tentative initiale ( cp
cat list.txt new_folder
) aurait déjà dû fonctionner. Pourquoi? Parce que la commande interne cat list.txt
est d'abord traitée par le shell et se développe en file1 file2 file3...file#
, ce qui est exactement ce que le shell attend et veut à cette partie de la commande. Si cela ne fonctionnait pas, alors (1) vous aviez une faute de frappe ou (2) vos noms de fichiers étaient étranges (ils avaient des espaces ou d'autres caractères inhabituels).
La raison pour laquelle toutes les réponses de Dennis fonctionnent est simplement qu'elles fournissent la liste de fichiers nécessaires cp
pour travailler, en plaçant cette liste à sa place dans la commande entière. Encore une fois, la commande elle-même est structurée:
cp list-of-files target_directory
Il est facile de voir comment tout cela se réunit dans cette version:
cp $(<list.txt) new_folder
$()
oblige le shell à exécuter la commande entre parenthèses, puis à substituer sa sortie à ce point de la ligne la plus grande. Ensuite, le shell exécute la ligne dans son ensemble. Soit dit en passant, $()
est une version plus moderne de ce que vous faisiez déjà avec des backticks (`). Suivant: <
est un opérateur de redirection de fichiers. Il indique au shell de vider le contenu de list.txt
l'entrée standard. Puisque le $()
bit est traité en premier, voici ce qui se passe par étapes:
cp $(<list.txt) new_folder
# split line into three tokens: cp, $(<list.txt), new_folder
cp file1 file2 file3...file# new_folder
# substitute result of $(<list.txt) into the larger command
De toute évidence, l'étape 2 est simplement la cp
commande normale que vous vouliez.
Je me rends compte que je bat beaucoup ce cheval (peut-être très mort), mais je pense que ça vaut le coup. Comprendre exactement comment le shell traite une commande peut vous aider à mieux l'écrire et à simplifier beaucoup. Il vous montrera également où les problèmes sont susceptibles de se cacher. Dans ce cas, par exemple, ma première question devrait vous concerner des noms de fichiers amusants ou une possible faute de frappe. Aucune acrobatie n'était nécessaire.