我正在尝试查找给定目录中的目录和文件的数量。我正在像这样运行我的 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 命令,它们对两者都很有效。
为什么我不能以这种方式使用 find?
答案1
尝试将您想要搜索的目录作为参数传递给 bash 脚本:
#!/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
是可行的方法。
答案2
发生这种情况可能是因为您对其他人的目录没有读取权限。如果您没有读取权限,则无法查看/搜索/查找任何内容。您可以使用以下命令检查这一点:
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
电视是其中之一:
- file d directory c character device b block device l symbolic link
来源:Unix 文件权限简介
另外,当您使用:
find -type d
- 您仅搜索目录。find -type f
- 您仅搜索常规文件。