Question

Je commence avec un fichier contenant une liste de centaines de fichiers (chemin complet) dans un ordre aléatoire. Je voudrais énumérer les détails des dix derniers fichiers dans cette liste. Ceci est ma tentative naïve:

$ ls -las -t `cat list-of-files.txt` | head -10

Que des œuvres, tant qu'aucun des fichiers ont des espaces dans, mais échoue s'ils le font que ces fichiers sont répartis dans les espaces et traités comme des fichiers séparés. Fichier "Bonjour tout le monde" me donne:

ls: hello: No such file or directory
ls: world: No such file or directory

J'ai essayé de citer les fichiers dans le fichier des fichiers de liste d'origine, mais l'ici le document divise encore les fichiers en les espaces dans les noms de fichiers, le traitement des citations dans le cadre des noms de fichiers:

$ ls -las -t `awk '{print "\"" $0 "\""}' list-of-files.txt` | head -10

ls: "hello: No such file or directory
ls: world": No such file or directory

La seule façon que je peux penser à le faire, est de ls chaque fichier individuellement (en utilisant xargs peut-être) et de créer un fichier intermédiaire avec les listes de fichiers et la date dans un ordre sortable que le premier champ de chaque ligne, puis trier ce fichier intermédiaire. Cependant, cela se sent un peu lourd et inefficace de (des centaines de commandes ls plutôt que d'un ou deux). Mais ce peut être la seule façon de le faire?

Est-il possible de passer « ls » une liste de fichiers à traiter, où ces fichiers pourraient contenir des espaces -. Il semble que cela devrait être simple, mais je suis déconcerté

Était-ce utile?

La solution

Au lieu de « un ou plusieurs caractères blancs », vous pouvez forcer bash utiliser un autre séparateur de champ:

OIFS=$IFS
IFS=$'\n'

ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS

Cependant, je ne pense pas que ce code serait plus efficace que de faire une boucle; en plus, cela ne fonctionnera pas si le nombre de fichiers dans la liste-de-files.txt dépasse le nombre maximum d'arguments.

Autres conseils

Essayez ceci:

xargs -a list-of-files.txt ls -last | head -n 10

Je ne suis pas sûr que cela fonctionne, mais avez-vous essayé espaces s'échapper avec \? Avec sed ou quelque chose. sed "s/ /\\\\ /g" list-of-files.txt, par exemple.

Cela a fonctionné pour moi:

xargs -d\\n ls -last < list-of-files.txt | head -10
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top