避免匹配。和..在POSIX Shell中循环浏览文件时

时间:2019-07-08 05:21:31

标签: sh

我想对目录中的每个文件进行操作,所以我有

for f in /path/* /path/.*; do
  [ -e "$f" ] || continue
  do_thing "$f"
done

不幸的是,这也匹配...,在这种情况下是不希望的。如何避免匹配...

4 个答案:

答案 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,您现在可以对其进行迭代,因为结果仅由空格分隔。