вывести имена и количество строк для каждого файла в каталоге

вывести имена и количество строк для каждого файла в каталоге

Я должен написать скрипт оболочки, в который я отправляю аргумент командной строки, представляющий каталог. Затем я должен вывести все имена файлов и количество строк для каждого файла из этого каталога. Я также должен сделать это только для первых 10 файлов не старше 10 минут.

find "$1" -cmin -10 -type f | head -10 

Это то, что я пытался найти для файлов новее 10 минут, но я получил некоторые ошибки. И я также не уверен, как получить имена. Заранее спасибо за всю помощь.

Мои имена файлов свободны. Ошибка, которую я получаю, заключается в том, что разрешение отклонено при передаче моего домашнего каталога в качестве аргумента. Поэтому я не получаю список имен. Я должен получить и список имен файлов, и количество строк каждого из этих файлов.

При вводе данных /bin/bash ss1 /home/ivanaв терминал возникает следующая ошибка:

find: '/home/ivana/.cache/dconf': Permission denied

Я использую Linux.

решение1

Хорошо, сначала о главном. Ошибка, которую вы получаете, не имеет значения, она просто означает, что определенный подкаталог ( /home/ivana/.cache/dconf) вашего $HOMEне принадлежит вам. Это почти наверняка произошло из-за того, что вы запустили графическое приложение с sudo. Простое исправление:

sudo chown -R ivana /home/ivana/

Это изменит владельца всех файлов и каталогов в вашем $HOMEback на ваше имя пользователя. Если вы можете иметь там вещи, которые правильно принадлежат другому пользователю, то просто измените владельца каталога dconf:

sudo chown -R ivana /home/ivana/.cache/dconf

Итак, как сделать это правильно и работать с произвольными именами файлов:

find "$1" -cmin -10 -type f -print0 | head -z -n 10 

Это приведет findк печати каждого найденного файла с завершающим символом \0вместо новой строки, что гарантирует работу с файлами, имена которых содержат символы новой строки. Опция -zзаставляет headего читать \0ввод с разделителями.

Следующий шаг — прочитать каждый из файлов и вывести количество строк в них:

find "$1" -cmin -10 -type f -print0 | head -z -n 10 |
    while IFS= read -r -d '' file; do wc -l "$file"; done

Устанавливает IFS=разделитель полей ввода пустым, не обрабатывается -rспециально (поэтому не становится символом табуляции) и сообщает о необходимости считывать данные, разделенные символом -.read\\t-d ''read\0

Связанный контент