Список файлов в порядке дат с пробелами в именах файлов - PullRequest
1 голос
/ 03 января 2011

Я начинаю с файла, содержащего список сотен файлов (полные пути) в случайном порядке. Я хотел бы перечислить детали десяти последних файлов в этом списке. Это моя наивная попытка:

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

Это работает, если в файлах нет пробелов, но происходит сбой, если они есть, поскольку эти файлы разбиты на пробелы и рассматриваются как отдельные файлы. Файл "Здравствуй, мир" дает мне:

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

Я попытался процитировать файлы в исходном файле со списком файлов, но здесь документ по-прежнему разделяет файлы на пробелы в именах файлов, рассматривая кавычки как часть имен файлов:

$ 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

Единственный способ, которым я могу думать об этом, - это отобразить каждый файл по отдельности (возможно, используя xargs) и создать промежуточный файл с списками файлов и датой в порядке сортировки в качестве первого поля в каждой строке, а затем отсортировать этот промежуточный файл. Однако это кажется немного громоздким и неэффективным (сотни команд ls, а не одна или две). Но это может быть единственный способ сделать это?

Есть ли способ передать "ls" список файлов для обработки, где эти файлы могут содержать пробелы - кажется, это должно быть просто, но я в замешательстве.

Ответы [ 4 ]

6 голосов
/ 03 января 2011

Вместо «одного или нескольких пустых символов» вы можете заставить bash использовать другой разделитель полей:

OIFS=$IFS
IFS=$'\n'

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

Однако я не думаю, что этот код был бы более эффективным, чем выполнение цикла; кроме того, это не сработает, если количество файлов в list-of-files.txt превышает максимальное количество аргументов.

2 голосов
/ 03 января 2011

Попробуйте это:

xargs -a list-of-files.txt ls -last | head -n 10
1 голос
/ 03 января 2011

Это сработало для меня:

xargs -d\\n ls -last < list-of-files.txt | head -10
1 голос
/ 03 января 2011

Я не уверен, сработает ли это, но вы пытались экранировать пробелы с \?Используя sed или что-то.sed "s/ /\\\\ /g" list-of-files.txt, например.

...