Я пытаюсь найти количество папок и файлов в данном каталоге. Я запускаю свой скрипт bash следующим образом:
ARCHIVE=/path/to/archive ./myScript
в моем скрипте я делаю это:
#find the number of non-empty directories in the given dir
dirs=$(find $ARCHIVE -mindepth 1 -maxdepth 1 -not -empty -type d | wc -l)
#find the number of files in the given dir
msgs=$(find $ARCHIVE -type f | wc -l)
echo "Number of directories: $dirs"
echo "Total number of messages: $msgs"
Это прекрасно работает, когда я запускаю скрипт на подмножестве Данные, которые я просматриваю, находятся в директории на том же уровне, что и скрипт. Однако фактические данные находятся в чужом каталоге, и когда я запускаю их с переменной ARCHIVE, установленной в это местоположение, оба значения возвращаются как 0. У меня есть аналогичный скрипт, который я также использую, и команда find там не работает второй каталог тоже. Как ни странно, я использую некоторые команды egrep, и они отлично работают для обоих.
Почему я не могу использовать поиск таким образом?
Попытайтесь передать каталог, который Вы хотите искать в качестве параметра на сценарий удара:
#!/usr/bin/env bash
# First argument to script shall be directory in which to search
ARCHIVE=$1
#find the number of non-empty directories in the given dir
dirs=$(find "$ARCHIVE" -mindepth 1 -maxdepth 1 -not -empty -type d | wc -l)
#find the number of files in the given dir
msgs=$(find "$ARCHIVE" -type f | wc -l)
echo "Number of directories: $dirs"
echo "Total number of messages: $msgs"
Запущение скрипта, названного dirfiles
, на моем корневом каталоге:
$ ./dirfiles ~
Number of directories: 27
Total number of messages: 8703
И на /usr/lib
:
$ ./dirfiles /usr/lib
Number of directories: 161
Total number of messages: 9630
Кроме того, find
предложения три способа разрешить символьные ссылки:
-P
: не переходите по символьным ссылкам-L
: перейдите по символьным ссылкам-H
: не переходите по символьным ссылкам кроме тех случаев, когда обработка параметров командной строки.Если Вы не хотите следовать за символьными ссылками, но $ARCHIVE
оказывается, один, затем возможно, -H
путь состоит в том, чтобы пойти.
Это происходит потому, что, вероятно, у вас нет прав на чтение в чужом каталоге. Если у вас нет прав на чтение, вы не можете просматривать / искать / находить контент. Вы можете проверить это с помощью следующей команды:
ls -l /home/username/directory
Также убедитесь, что эти файлы или каталоги, для которых вы ищете, действительно являются файлами или каталогами (первый символ из 10-символьного разрешения строки - -
или d
], не что-то еще - l
в вашем случае, что означает символические ссылки).
ls
показывает разрешения в виде строки из 10 символов, например-rw-r--r--
. Символы можно интерпретировать какTUUUGGGOOO
, где:T Type UUU Rights for the owner of the file GGG Rights for users in the group OOO Rights for others, not listed above
T является одним из:
blockquote>- file d directory c character device b block device l symbolic link
Источник: Введение для доступа к файлам Unix
Также, когда вы используете:
find -type d
- вы ищете только каталоги.find -type f
- вы ищете только обычные файлы.