以无需解析ls或find的方式列出目录中所有文件的便携方式

时间:2014-02-03 17:13:20

标签: shell unix sh glob

我正在尝试获取给定目录中所有文件的列表,以便为简单的dotfiles Makefile提供文件名列表。想法是将文件名列表放入变量中,然后从列表中删除诸如Makefile本身的“元”文件列表。然后,列表中的文件符号链接到$ HOME。

我不想parse ls or find因为我不能依赖一些随机程序来命名它的配置文件而没有空格。而且我也不能依赖程序来启动带有“点”的“dotfiles”文件名。

我在parse ls or find尝试了使用* glob的for循环解决方案。问题是,默认情况下,globs不匹配以点开头的文件。

每个shell中都有一些globbing选项(bash,zsh等),它们使* glob扩展为包含.dotfiles,甚至可以排除。和..但那不便携。

有什么建议吗?

如果您看到XY problem,请告诉我。

2 个答案:

答案 0 :(得分:2)

分两步执行glob,并手动修剪...条目,或者使用“常规文件”测试。当然,“回声”仅用于测试。将其添加到您的列表中进行非平凡的处理。

编辑:傻我。而不是实际循环两次,所有文件的列表(有和没有点)只是* .*。此外,测试命令[将其参数作为字符串,因此我们需要为空格引用它。修改后的代码:

# Process non-dotfiles and dotfiles.  (Only the regular files)
for f in * .*; do 
    if [ -f "$f" ]; then
        echo $f 
    fi; 
done

或者,使用find一次完成整个作业,包括符号链接。例如:

find . -type f \( ! -iname Makefile \) -exec ln -s \{\} newdir/\{\} \;

或者,使用源链接中建议的find -print0模式使用两者的组合:这将正确处理空格和换行符,让您的脚本获得以空值分隔的文件名来存储和进一步处理。

答案 1 :(得分:0)

你说

  

我不想解析ls或者找不到因为我不能依赖一些随机程序来命名它的配置文件而没有空格。

空白问题是find具有-print0选项的原因,用于打印由空字符(ASCII 0)分隔的输出,这些字符无法出现在文件名中。