获取目录的内容,不包括 .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 脚本。我不会使用其他编程语言。
现在我正在使用以下命令来实现此目的:
要获取我使用的所有 .txt
文件:find . -type f \( -name "*.txt" \)
。 .git
中没有 .txt
个文件,所以这是有效的。
要获取我使用的所有 non-txt
文件:find . -type f \( ! -name "*.txt" \)
。问题是我还从 .git
获取了所有文件,但我不知道如何忽略它们。
要获得所有 directories
和 sub-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
.
我需要获取作为 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 脚本。我不会使用其他编程语言。
现在我正在使用以下命令来实现此目的:
要获取我使用的所有
.txt
文件:find . -type f \( -name "*.txt" \)
。.git
中没有.txt
个文件,所以这是有效的。要获取我使用的所有
non-txt
文件:find . -type f \( ! -name "*.txt" \)
。问题是我还从.git
获取了所有文件,但我不知道如何忽略它们。要获得所有
directories
和sub-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
.