我想在bash中检查目录是否包含文件。 我的代码在这里。
for d in {,/usr/local}/etc/bash_completion.d ~/.bash/completion.d
do
[ -d "$d" ] && [ -n "${d}/*" ] &&
for f in $d/*; do
[ -f "$f" ] && echo "$f" && . "$f"
done
done
问题是“〜/ .bash / completion.d”没有文件。 所以,$ d / *被认为是简单的字符串“〜/ .bash / completion.d / *”,而不是空字符串,这是文件名扩展的结果。 作为该代码的结果,bash尝试运行
. "~/.bash/completion.d/*"
当然,它会生成错误消息。
任何人都可以帮助我吗?
答案 0 :(得分:6)
如果设置nullglob bash选项,请通过
shopt -s nullglob
然后globbing将丢弃与任何文件都不匹配的模式。
答案 1 :(得分:4)
# NOTE: using only bash builtins # Assuming $d contains directory path shopt -s nullglob # Assign matching files to array files=( "$d"/* ) if [ ${#files[@]} -eq 0 ]; then echo 'No files found.' else # Whatever fi
对数组的赋值还有其他好处,包括对包含空格的文件名/路径的理想(正确!)处理,以及不使用子shell的简单迭代,如下面的代码所示:
find "$d" -type f | while read; do # Process $REPLY done
相反,您可以使用:
for file in "${files[@]}"; do # Process $file done
有一个好处,即循环由主shell运行,这意味着在循环中产生的副作用(例如变量赋值)对于脚本的其余部分是可见的。当然,如果性能是一个问题,它也会方式更快。
最后,还可以在命令行参数中插入数组(不分割包含空格的参数):
$ md5sum fileA "${files[@]}" fileZ
你应该总是试图正确处理包含空白区域的文件/路径,因为有一天它们会发生!
答案 2 :(得分:0)
您可以通过以下方式直接使用find
:
for f in $(find {,/usr/local}/etc/bash_completion.d ~/.bash/completion.d -maxdepth 1 -type f);
do echo $f; . $f;
done
但如果找不到某个目录,find
将打印警告,如果目录存在,您可以在测试后放置2> /dev/null
或放置find
调用(如{在你的代码中。)
答案 3 :(得分:0)
find() {
for files in "$1"/*;do
if [ -d "$files" ];then
numfile=$(ls $files|wc -l)
if [ "$numfile" -eq 0 ];then
echo "dir: $files has no files"
continue
fi
recurse "$files"
elif [ -f "$files" ];then
echo "file: $files";
:
fi
done
}
find /path
答案 4 :(得分:0)
另一种方法
# prelim stuff to set up d
files=`/bin/ls $d`
if [ ${#files} -eq 0 ]
then
echo "No files were found"
else
# do processing
fi