bash测试一组目录是否存在

时间:2010-05-28 19:30:34

标签: bash

将文档存储在包含“每日”目录的文件系统中,例如20050610.在bash脚本中,我想列出一些月份的文件。所以我正在运行一个find命令find <path>/200506* -type f >> jun2005.lst。想要在执行find命令之前检查这组目录是否为空集。但是,如果我使用if[ -d 200506* ],我会收到“太多争论错误。我怎样才能解决这个问题?

5 个答案:

答案 0 :(得分:2)

您的“太多参数”错误并非来自存在大量文件且超出命令行参数限制。它来自拥有多个匹配glob的一个或两个目录。您的glob“200506 *”扩展为“20050601 20050602 20050603 ...”,-d测试只需要一个参数。

$ mkdir test
$ cd test
$ mkdir a1
$ [ -d a* ]    # no error
$ mkdir a2
$ [ -d a* ]
-bash: [: a1: binary operator expected
$ mkdir a3
$ [ -d a* ]
-bash: [: too many arguments

zed_0xff 的答案是正确的,但我会采用不同的方法:

shopt -s nullglob
path='/path/to/dirs'
glob='200506*/'
outfile='jun2005.lst'
dirs=("$path"/$glob)  # dirs is an array available to be iterated over if needed
if (( ${#dirs[@]} > 0 ))
then
    echo "directories found"
    # append may not be necessary here 
    find "$path"/$glob -type f >> "$outfile"
fi

"$path"/$glob"$path/$glob"中引号的位置对于此工作至关重要。

修改

进行更正以排除与glob匹配的文件(因此只包含目录)并处理名为字面的目录(“200506 *”)的非常不寻常的情况。

答案 1 :(得分:1)

prefix="/tmp/path"
glob="200611*"
n_dirs=$(find $prefix -maxdepth 1 -type d -wholename "$prefix/$glob" |wc -l)
if [[ $n_dirs -gt 0 ]];then 
   find $prefix -maxdepth 2 -type f -wholename "$prefix/$glob" 
fi

答案 2 :(得分:0)

S=200506*

if [ ${#S} -gt 6 ]; then
    echo haz filez!
else
    echo no filez
fi

不是一个非常优雅的,但没有任何外部工具/命令(如果不认为“[”作为外部工具/命令)

线索是,如果有一些文件匹配,那么“S”变量将包含用空格分隔的名称。否则它本身将包含一个“200506 *”字符串。

答案 3 :(得分:0)

你们可以这样ls

  if [ -n "$(ls -d | grep 200506)" ]; then
        # There are directories with this pattern
  fi

答案 4 :(得分:0)

因为大多数shell中的命令行长度都有限制:像“$(ls -d | grep 200506)”或/ path / 200506 *这样的任何内容都有溢出限制的风险。我不确定BASH中是否有替换和glob扩展计入它,但我假设如此。您必须对其进行测试并检查bash文档和源代码以确定。

答案是简化你的问题。

find <path>/200506* -type f -exec somescript '{}' \;

其中somescript是执行测试的shell脚本。也许是这样的事情:

#!/bin/sh
[ -d "$@" ] && echo "$@" >> june2005.lst

将june2005.lst传递给脚本(建议:使用环境变量),并处理200506 *可能扩展到太大的文件路径的任何可能性,留作OP的练习;)

通过最小化生成的shell数量,将整个事物集成到管道中或调整更通用的脚本语言可以提高性能。现在那会很有趣。这是一个提示,使用-exec和另一个程序(awk,perl等)作为单行过滤器的一部分进行目录测试,并在查找命令上保留&gt;&gt; june2005.lst。