我想对目录中的每个文件进行操作,所以我有
for f in /path/* /path/.*; do
[ -e "$f" ] || continue
do_thing "$f"
done
不幸的是,这也匹配.
和..
,在这种情况下是不希望的。如何避免匹配.
和..
?
答案 0 :(得分:3)
要在当前目录中的每个文件上运行do_thing
,请尝试:
find /path -maxdepth 1 -type f -exec do_thing {} \;
此方法避免循环并避免解析ls
。
find /path
这将启动find
命令,并指示find在目录/path
中查找。
-maxdepth 1
这告诉find
仅在当前目录中查找,而不能进入子目录。
-type f
这告诉find
我们只是在寻找常规文件(而不是目录)。
-exec do_thing {} \;
这会在找到的每个文件上运行命令do_thing
。
答案 1 :(得分:1)
如何使用if
来避免它们?
tmp_path=/path
for f in $tmp_path/* $tmp_path/.*; do
if [ "$f" == "$tmp_path/." ] || [ "$f" == "$tmp_path/.." ]
then
continue
fi
[ -e "$f" ] || continue
echo "$f"
done
答案 2 :(得分:1)
以下内容应与所有隐藏文件匹配,并排除.
和..
for f in `ls -a /path | grep -vE "^\.{1,2}$"`; do
# whatever
done
-v
反转匹配,\.
匹配文字点,{1,2}
匹配一次或两次,^
和$
匹配开始和结束线,分别。 -E
标志使{m,n}
语法起作用。反引号`防止外壳在管道上阻塞。 (嗨)
答案 3 :(得分:1)
clean_path=`ls -a ~/example_dir/ | grep -v -P "^\.{1,2}$"`
for f in $clean_path; do
do_thing $f;
done
ls -a ~/some_dir
命令以打印出some_dir
目录中的所有文件。
^\.{1,2}$
的意思是,以(^
)开头的(\.
)字符串匹配,该点可能以1-2个字符({1,2}
)开头,并且这是字符串($
的结尾,因此它将与.
和..
都匹配。
在命令中使用反引号表示“处理此命令的结果”。
grep -v -P
,-v
标志可将答案取反,因此它将排除名为.
和..
的匹配文件。 -P
标志可使用Perl正则表达式。
Voila,您现在可以对其进行迭代,因为结果仅由空格分隔。