Как использовать "find" и "grep", чтобы получить размер файла тоже? - PullRequest
0 голосов
/ 30 января 2020

У меня есть этот скрипт:

find test -type f \( -iname \*.html -o -iname \*.htm -o -iname \*.xhtml \) -exec grep -il ".swf" {} \; -printf '%k KB - \t %p\n' > result-swf-files.csv

Это будет искать в каталоге "test" (и его подкаталогах) все файлы HTML, в которых содержится слово ".swf". ANd напишет файл CSV с результатами.

Но я хочу, чтобы размер файла тоже был в одной строке (теперь скрипт выводит в одну строку результат grep - у которого нет размера файла - и в другой строке результат printf - который включает размер файла). Как добавить опцию в grep, чтобы получить размер файла?

1 Ответ

1 голос
/ 30 января 2020

Менее многословный способ - использовать рекурсивный grep (если ваша система его поддерживает):

grep -rl --include="*.htm*" ".swf" test|xargs ls -l|awk '{ print $9 "," $5 }'

Объяснение:

  • Grep рекурсивно с использованием флага "rl"
  • включает шаблон файла "* .htm"
  • поиск строки ".swf" в каждом файле htm *
  • поиск только по "тесту" каталог
  • направляет результат в xargs , где каждое имя файла становится аргументом команды "ls -l"
  • Затем используйте awk , чтобы получить только имя файла и размер файла. Используйте запятую "," между 9-м и 5-м столбцами в awk print, чтобы получить вывод csv.

Не стесняйтесь заменять "ls -l" на читаемые человеком варианты, такие как "ls -lk" или "ls -lh"

Кроме того, в вашем скрипте вы можете просто напечатать только 2-ю строку каждого файла (ту, которая содержит размер). Вы можете просто передать и использовать grep следующим образом: grep "[0-9] [KB]"

Ниже приведена полная команда:

find . -type f \( -iname \*.html -o -iname \*.htm -o -iname \*.xhtml \) -exec grep -il ".swf" {} \; -printf '%k KB - \t %p\n'| grep "[0-9] [KB]"
...