Я должен написать скрипт оболочки, в который я отправляю аргумент командной строки, представляющий каталог. Затем я должен вывести все имена файлов и количество строк для каждого файла из этого каталога. Я также должен сделать это только для первых 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/
Это изменит владельца всех файлов и каталогов в вашем $HOME
back на ваше имя пользователя. Если вы можете иметь там вещи, которые правильно принадлежат другому пользователю, то просто измените владельца каталога 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