如何遍历目录中的文件(不包括隐藏文件)

如何遍历目录中的文件(不包括隐藏文件)

使用:

for eachfile in /mnt/thara/*

它还会遍历隐藏文件。我不需要隐藏文件。

答案1

bash 的正常行为是在使用 for 时不查看隐藏文件。但可以使用 shopt 命令更改此行为。

要启用扫描带有“*”的隐藏文件:

shopt -s dotglob

禁用扫描带有“*”的隐藏文件(默认行为)

shopt -u dotglob

所以尝试这样的脚本:

shopt -u dotglob
for eachfile in /mnt/thara/*

现在隐藏的文件必须消失。

答案2

其他方式是

for eachfile in /mnt/thara/[^.]*

答案3

我同意有关 shell 选项的评论dotglob。如果未设置,则 for 循环的行为是预期的:

utente@computer:/tmp/test$ shopt | grep dotglob
dotglob         off

ab、 、c为普通文件;.hidden1.hidden2隐藏文件:

utente@computer:/tmp/test$ touch a b c .hidden1 .hidden2

utente@computer:/tmp/test$ ls -al
totale 8
drwxrwxr-x  2 utente utente 4096 giu 10 18:28 .
drwxrwxrwt 13 root   root   4096 giu 10 18:28 ..
-rw-rw-r--  1 utente utente    0 giu 10 18:28 a
-rw-rw-r--  1 utente utente    0 giu 10 18:28 b
-rw-rw-r--  1 utente utente    0 giu 10 18:28 c
-rw-rw-r--  1 utente utente    0 giu 10 18:28 .hidden1
-rw-rw-r--  1 utente utente    0 giu 10 18:28 .hidden2

对于循环:

utente@computer:/tmp/test$ for eachfile in * ; do ls $eachfile ; done

a
b
c

另一种独立于 shell 选项的方法:让我们指示find过滤掉其初始字符与点匹配的所有路径名.

utente@computer:/tmp/test$ find . \( ! -path '*/.*' \) -type f  -exec ls {} \;

./c
./b
./a

也可以看看这个问题在 superuser.com 上

答案4

或者很简单..

ls -l | egrep -v "^\."

或迭代显示文件名的所有目录:

ls -R | egrep -v "^\."

相关内容