find не работает с моей переменной

Я пытаюсь найти количество папок и файлов в данном каталоге. Я запускаю свой скрипт 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, и они отлично работают для обоих.

Почему я не могу использовать поиск таким образом?

3
задан 16 October 2013 в 18:23

2 ответа

Попытайтесь передать каталог, который Вы хотите искать в качестве параметра на сценарий удара:

#!/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 путь состоит в том, чтобы пойти.

1
ответ дан 16 October 2013 в 18:23

Это происходит потому, что, вероятно, у вас нет прав на чтение в чужом каталоге. Если у вас нет прав на чтение, вы не можете просматривать / искать / находить контент. Вы можете проверить это с помощью следующей команды:

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 является одним из:

- file
d directory
c character device
b block device
l symbolic link

Источник: Введение для доступа к файлам Unix

Также, когда вы используете:

  • find -type d - вы ищете только каталоги.
  • find -type f - вы ищете только обычные файлы.
0
ответ дан 16 October 2013 в 18:23

Другие вопросы по тегам:

Похожие вопросы: