用例中脚本文件名具有前导数字来确定执行顺序


9

我正在寻找文档或用例,其中在Linux中有一个包含Shell脚本的目录,其中每个文件名都以数字开头,并且文件以该特定顺序运行。这个约定叫做什么,在哪里使用?

例如:

0001-motd.sh
0002-proxy.sh
0300-ssh.sh

我知道我以前见过,只是不确定在哪里或叫什么。


1
您是否正在考虑目录中的运行级别脚本/etc/rc?.d
约翰·安德森

Answers:


12

听起来您是在指 run-parts

NAME
       run-parts - run scripts or programs in a directory

SYNOPSIS
       run-parts  [--test]  [--verbose] [--report] [--lsbsysinit] [--regex=RE]
       [--umask=umask] [--arg=argument] [--exit-on-error] [--help] [--version]
       [--list] [--reverse] [--] DIRECTORY

       run-parts -V

DESCRIPTION
       run-parts  runs  all  the  executable  files  named  within constraints
       described below, found in directory directory.  Other files and  direc
       tories are silently ignored.

       If neither the --lsbsysinit option nor the --regex option is given then
       the names must consist entirely of ASCII upper- and lower-case letters,
       ASCII digits, ASCII underscores, and ASCII minus-hyphens.

       If  the  --lsbsysinit  option  is given, then the names must not end in
       .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
       one  or more of the following namespaces: the LANANA-assigned namespace
       (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
       (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
       (^[a-zA-Z0-9_-]+$).

       If the --regex option  is  given,  the  names  must  match  the  custom
       extended regular expression specified as that option's argument.

       Files  are  run  in  the  lexical  sort order (according to the C/POSIX
       locale character collation rules) of their names unless  the  --reverse
       option is given, in which case they are run in the opposite order.

是。它在很多地方都使用过。旧的SysV初始化文件(中的/etc/rc.*),网络管理器辅助脚本,X11启动,暂停恢复过程....
Rmano

-1

我不知道,这种方法/ hack是否可以解决您的问题。但是,我认为如果我答对了,这将起作用。

[feddy@localhost ~]$ mkdir test
[feddy@localhost ~]$ cd test
[feddy@localhost test]$ ls
[feddy@localhost test]$ vi 0001-ko.sh
[feddy@localhost test]$ cp 0001-ko.sh 0002-ko.sh
[feddy@localhost test]$ cp 0001-ko.sh 0004-ko.sh
[feddy@localhost test]$ cp 0001-ko.sh 0005-ko file.sh
[feddy@localhost test]$ cp 0001-ko.sh 0008-ko.sh
[feddy@localhost test]$ ls
0001-ko.sh  0002-ko.sh  0004-ko.sh  0005-ko file.sh  0008-ko.sh

[feddy@localhost test]$ for i in *
> do
> bash "$i"
> done
file 0001-ko.sh
file 0002-ko.sh
file 0004-ko.sh
file 0005-ko file.sh
file 0008-ko.sh
[feddy@localhost test]$

要么

$ find . -iname "*.sh"|while read f; do bash "$f"; done
file ./0001-ko1.sh
file ./0002-ko1.sh
file ./0005-ko1 file.sh
file ./0005-ko1.sh

您可以制作一个脚本并使用它来按顺序执行脚本(根据文件名中包含的数字,即xxxx-abcdef)在任何文件夹中。

如果我弄错了,请纠正我。


@steeldriver,对不起,如果文件名包含空格,则此代码无法正常工作。再次抱歉,我将要更新它。谢谢你的提醒。
bsdboy

我很确定,全局匹配的排序顺序(如果启用)遵循语言环境排序规则设置。
David Foerster

@DavidFoerster,是的,我也这么认为。
bsdboy

任何愿意在StackExchange网站上拒绝任何答案的人,至少要告诉作者他犯了什么错误,因此从下次开始,他将确保不会再发生相同的事情。因为为他人写一个正确的答案需要花费大量的时间和精力。而且,选民只需单击一个向下箭头,仅此而已。
bsdboy

我没有对这个答案投票,但是这个问题要求提供文档-“或者这叫什么?”,而不是执行此操作的脚本。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.