Перечисление файлов в порядке даты с пробелами в именах файлов

StackOverflow https://stackoverflow.com/questions/4583801

Вопрос

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

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

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

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» список файлов для обработки, где эти файлы могут содержать пробелы - кажется, что это должно быть просто, но я в тупике.

Это было полезно?

Решение

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

OIFS=$IFS
IFS=$'\n'

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

Тем не менее, я не думаю, что этот код будет более эффективным, чем делать цикл; Кроме того, это не сработает, если количество файлов в списке FILES.TXT превышает максимальное количество аргументов.

Другие советы

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

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

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

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

xargs -d\\n ls -last < list-of-files.txt | head -10
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top