LinuxForum.Fans
Тема

Вывод файлов содержащих строку отсортированных по размеру

Автор: Xcopy 8 сообщений 4085 просмотров
#307710

Добрый день! :)

Передо мной стоит следующая задача:
Мне необходимо вывести список файлов который возвращает команда grab в отсортированном по размеру файлов виде.
Я умудрился написать скрипт:

text
#!/bin/bash
grep -lw 'privet' $1/*
exit 0

На вход передается путь к директории, а на выходе (стандартный вывод) все файлы содержащие строчку "privet".
Это я сделал, но не могу сделать так, чтобы эти файлы выводились в отсортированном порядке, есть идея сделать связку ls -S с grep при помощи xargs но до меня не доходит как)

Заранее спасибо.

text
uname -a
Linux Misha 3.5.0-25-generic #39-Ubuntu SMP Mon Feb 25 19:02:34 UTC 2013 i686 i686 i686 GNU/Linux
misha@Misha:~/Документы$ 
#307738

Про xargs -- добавить несложно, но толку не будет, если размер аргументов превысит допустимый предел, будет несколько вызовов ls, и каждый следующий ничего не будет знать о предыдущих -- получится несколько отсортированных кусков:
grep -lw privet | xargs ls -S

#307789

bormant, может тогда в таком случае наоборот из ls -S передавать в grep?
чтобы grep искал в файлах в отсортированном порядке и выводил файлы по этому же порядку?

#307807

После долгих мучений решил задачу:

text
find $1 -type f | xargs -d '\n' ls -S1 | xargs -d '\n' grep -lw 'WORD'
#307808

Можно, даже для больших по числу файлов каталогов подойдет (если рекурсия не нужна):

text

ls -S | xargs grep -lw privet
#307809
text

$ ls -l
итого 16
-rw-r--r-- 1 sergey sergey 13 марта 10 14:53 f1.txt
-rw-r--r-- 1 sergey sergey 24 марта 10 14:53 f2.txt
-rw-r--r-- 1 sergey sergey 54 марта 10 14:53 f3.txt
-rw-r--r-- 1 sergey sergey 21 марта 10 14:54 f4.txt
text

$ grep -lw 'privet' *.txt
./f1.txt
./f3.txt
./f4.txt
text

$ ls -lS  `grep -lw 'privet' *.txt`
-rw-r--r-- 1 sergey sergey 54 марта 10 14:53 ./f3.txt
-rw-r--r-- 1 sergey sergey 21 марта 10 14:54 ./f4.txt
-rw-r--r-- 1 sergey sergey 13 марта 10 14:53 ./f1.txt
#307825

cmd1 | xargs cmd2
эквивалентно
cmd2 $(cmd1) или cmd2 `cmd1`
с той лишь разницей, что во втором случае легко нарваться на переполнение командной строки при большом количестве файлов и/или длинных именах.

#307831

bormant, спасибо, буду знать.

Войдите или зарегистрируйтесь, чтобы ответить.