获取目录的内容,不包括 .git in bash 中的所有内容

Getting the contents of a directory excluding everything inside .git in bash

我需要获取作为 git 存储库的目录的内容数。

我要得到的数字是:

1) Other directories inside the directory I am currently iterating (and the other sub-directories inside them if they exist)

2) .txt files inside the directory and its sub-directories

3) All the non-txt files inside the directory and its sub-directories

在上述所有情况下,我必须忽略 .git 目录,以及其中的所有文件和目录。

此外,我必须专门使用 bash 脚本。我不会使用其他编程语言。

现在我正在使用以下命令来实现此目的:

  1. 要获取我使用的所有 .txt 文件:find . -type f \( -name "*.txt" \).git 中没有 .txt 个文件,所以这是有效的。

  2. 要获取我使用的所有 non-txt 文件:find . -type f \( ! -name "*.txt" \)。问题是我还从 .git 获取了所有文件,但我不知道如何忽略它们。

  3. 要获得所有 directoriessub-directories,我使用:find . -type d。我不知道如何忽略 .git 目录及其子目录

有时写一个 bash 循环比一行代码更清晰

for f in $(find .); do
    if [[ -d $f && "$f" == "./.git" ]]; then
        echo "skipping dir $f";
    else
        echo "do something with $f";
    fi;
done

简单的方法是添加这些额外的测试:

find . ! -path './.git/*' ! -path ./.git -type f -name '*.txt'

问题是 ./.git 仍然被不必要地遍历,这需要时间。

相反,可以使用 -prune-prune 不是测试(如 -path-type)。这是一个 动作 。该操作是“如果它是目录,则不要下降当前路径”。它必须与打印操作分开使用。

# task 1
find . -path './.git' -prune -o -type f -name '*.txt' -print

# task 2
find . -path './.git' -prune -o -type f ! -name '*.txt' -print

# task 3
find . -path './.git' -prune -o -type d -print
  • 如果未指定 -print,默认操作也会打印 ./.git
  • 我用的是-path ./.git,因为你说的是​​“.git目录”。如果出于某种原因在树中还有其他 .git 个目录,它们 被遍历并打印。要忽略名为 .git 的树中的 所有 目录,请将 -path ./.git 替换为 -name .git.