如何防止 ls 递归列出子目录中的文件

如何防止 ls 递归列出子目录中的文件

例如,我在目录 /etc/ 中有不带扩展名和带扩展名的文件

/etc/profile

/etc/profile.1

/etc/profile.2

并且系统给出了一个包含一些文件的目录:

/etc/profile.d/file1

/etc/profile.d/file2

/etc/profile.d/file3

在脚本中,我想指定 ls 列出我的所有配置文件* 文件,但不列出与我的文件同名的目录中的文件。

是否列出目录名称“/etc/profile.d/”并不重要,但不应列出该目录下的文件。

我的愿望是根据手册页所说的,如果给出了选项“-R”, ls 只会递归地工作。

我想使用 ls 因为它的排序功能,并且因为 ls 可以显示修改、访问和创建时间等。

通常我会使用这个命令:

ls -la --time-style=long-iso /etc/profile*

但这不仅显示我的文件,ls 还会进入目录 /etc/profile.d 并列出该目录中的文件。

我对通用解决方案感兴趣,而不仅仅是针对本示例中的给定名称。

问候

[电子邮件受保护]

答案1

这就是它ls的用途,它ls目录的内容。

如果传递的文件不是目录,则会列出这些文件。为了获得该类型的文件的行为目录同样,您需要传递该-d选项,在这种情况下它会列出目录文件本身而不是其内容:

ls -l -d --time-style=long-iso /etc/profile*

我删除了它,-a因为它仅在ls列出目录内容时才相关(而不是目录本身,其列表ls在扩展 glob 后由 shell 传递给目录本身)。

重要的是要认识到,上面的内容不是ls生成文件列表,而是扩展/etc/profile*为匹配文件列表的 shell。

-d将全局扩展传递给ls.

如果使用zsh,您可以使用其stat内置函数从文件中检索元数据:

$ zmodload zsh/stat
$ stat -LF %FT%T.%N%z +mtime /etc/profile*
/etc/profile 2021-04-10T21:00:00.000000000+0100
/etc/profile.d 2022-09-22T17:26:49.109271759+0100

(此处使用明确的日期格式)。

就像 的输出一样ls,面对带有换行符的文件名仍然无法处理。但是,您可以将结果存储在数组中而不是显示它:

stat -nA mtimes -LF %FT%T.%N%z +mtime /etc/profile*

然后循环它:

for file mtime ($mtimes) print -r -- ${(q+)file} was last modified on $mtime

或者

printf '%q was last modified on %s\n' $mtimes

或者每个文件调用一个stat,将结果放入关联数组中,例如:

for file (/etc/profile*)
  stat -LH s -F %FT%T.%N%z -- $file &&
    print -r -- $file, $s[size] bytes big was last modified on $s[mtime]

答案2

怎么样find

find /etc -maxdepth 1 -name "profile*" -type f

相关内容