目录 * 和文件顺序

Cat * and order of files

我需要将目录中的所有文件连接到一个文件中,但具有指定名称的文件必须位于输出的顶部。 只需执行 cat * > result 即可按字母顺序连接所有文件。 有没有办法告诉 cat 将文件 vars.css 或任何其他文件放在输出的开头? 现在我只是重命名文件需要先到 000-filename 但我想知道是否有更好的解决方案而不重命名文件。

你必须明确,但如果文件应该放在第一位,扩展模式会更容易一些。

shopt -s extglob
cat vars.css !(vars.css) > result

!(vars.css) 类似于 *,但匹配所有内容 除了 vars.css.

否则,您正在考虑定义自定义语言环境,其中 vars.css 在相对于其他文件的所需位置排序。这真的不是简单的globbing适合的东西。

有很多方法可以实现这一点,其中大部分都涉及调用另一个程序来帮助生成文件列表(按首选顺序)。

一种仅使用 bash 实现它的方法(并假设您想要手动移动到前面的少量文件)是:

(GLOBIGNORE=vars.css && cat vars.css *)

如果您有多个文件要放在列表的前面,它们可以包含在 GLOBIGNORE 中:

(GLOBIGNORE=vars.css:other.file && cat vars.css other.file *)

GLOBIGNORE 环境变量告诉 bash 在扩展 glob 时忽略与这些模式匹配的文件(例如 *)。有关详细信息,请参阅 bash manual

重要的是要确保 GLOBIGNORE 不会意外地设置为 shell 的其余部分(感谢 Tim 指出)。您可以通过多种方式实现这一点,例如我在上面通过将整个语句放在括号内所做的。如果你 运行 它没有括号,你应该确保你在之后取消设置 GLOBIGNORE:unset GLOBIGNORE