例如,我在目录 /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
的用途,它l
是s
目录的内容。
如果传递的文件不是目录,则会列出这些文件。为了获得该类型的文件的行为目录同样,您需要传递该-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