Перечисление файлов в порядке даты с пробелами в именах файлов
Вопрос
Я начинаю с файла, содержащего список сотен файлов (полных путей) в случайном порядке. Я хотел бы перечислить подробности десяти последних файлов в этом списке. Это моя наивная попытка:
$ 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