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