Bash脚本:获取文件的子列表

Bash脚本:获取文件的子列表,bash,shell,Bash,Shell,我将特定版本的SQL脚本存储在以发布版本命名的“脚本”子目录中,例如 ... ./scripts/1.8.3/script-1.8.3.sql ./scripts/1.8.4/script-1.8.4.sql ./scripts/1.8.4.1/script-1.8.4.1.sql ./scripts/1.8.4.2/script-1.8.4.2.sql ./scripts/1.8.4.3/script-1.8.4.3.sql ./scripts/1.9.0/script-1.9.0.sql .

我将特定版本的SQL脚本存储在以发布版本命名的“脚本”子目录中,例如

...
./scripts/1.8.3/script-1.8.3.sql
./scripts/1.8.4/script-1.8.4.sql
./scripts/1.8.4.1/script-1.8.4.1.sql
./scripts/1.8.4.2/script-1.8.4.2.sql
./scripts/1.8.4.3/script-1.8.4.3.sql
./scripts/1.9.0/script-1.9.0.sql
./scripts/1.9.1/script-1.9.1.sql
./scripts/1.9.2/script-1.9.2.sql
./scripts/1.9.3/script-1.9.3.sql
./scripts/1.9.4/script-1.9.4.sql
./scripts/1.9.5/script-1.9.5.sql
./scripts/1.9.6/script-1.9.6.sql
./scripts/1.9.6.1/script-1.9.6.1.sql
...    
在bash脚本中,我需要获取应用于特定版本号之外的所有SQL文件。例如,如果这个版本号是1.9.4,我想得到这个列表

./scripts/1.9.4/script-1.9.4.sql
./scripts/1.9.5/script-1.9.5.sql
./scripts/1.9.6/script-1.9.6.sql
./scripts/1.9.6.1/script-1.9.6.1.sql
...    
我知道我可以通过

all_files = `find . -name '*.sql' | sort`

但我不确定如何筛选此列表以获取特定版本上或之后的所有文件。

使用regexp强制匹配模式:

echo 1.2.3 | awk -F'.' '{ ver=1000000*$1 + 1000*$2 + $3; if (ver > 1002001) print $_ }'
find . -name "*.sql" | egrep -v "1\.[0-8]|1\.9\.[0-3]"
sed的更好方式:


说明:反向排序,然后在匹配版本1.9.4时立即使用sed停止处理输入。

使用regexp强制匹配模式:

find . -name "*.sql" | egrep -v "1\.[0-8]|1\.9\.[0-3]"
sed的更好方式:


说明:按相反顺序排序,然后在1.9.4版本匹配时使用sed停止处理输入。

如果文件按时间顺序创建,则会出现一次扭曲

find . -name \*.sql -newer ./scripts/$VERSION/script-$VERSION.sql -print

如果文件是按时间顺序创建的,则会出现一个扭曲

find . -name \*.sql -newer ./scripts/$VERSION/script-$VERSION.sql -print

这是一个基于Quassnoi的广义版本

假定

 $ ls -1 releases/
  program-0.0.1.app
  program-0.0.10.app
  program-0.0.9.app
  program-0.3.1.app
  program-3.3.1.app
  program-3.30.1.app
  program-3.9.1.app
注意0.0.10在0.0.9之前,这是错误的。但是,如果我们执行一些版本数学,我们会得到正确的顺序:

 $ ls -1 releases/ | sed 's/\(program-\)\(.*\)\(\.app\)/\2 \1\2\3/g' | awk -F '.' '{ ver=1000000*$1 + 1000*$2 + $3; printf "%010d %s\n", ver, $0}' | sort | awk '{print $3}'
 program-0.0.1.app
 program-0.0.9.app
 program-0.0.10.app
 program-0.3.1.app
 program-3.3.1.app
 program-3.9.1.app
 program-3.30.1.app

这是一个基于Quassnoi的广义版本

假定

 $ ls -1 releases/
  program-0.0.1.app
  program-0.0.10.app
  program-0.0.9.app
  program-0.3.1.app
  program-3.3.1.app
  program-3.30.1.app
  program-3.9.1.app
注意0.0.10在0.0.9之前,这是错误的。但是,如果我们执行一些版本数学,我们会得到正确的顺序:

 $ ls -1 releases/ | sed 's/\(program-\)\(.*\)\(\.app\)/\2 \1\2\3/g' | awk -F '.' '{ ver=1000000*$1 + 1000*$2 + $3; printf "%010d %s\n", ver, $0}' | sort | awk '{print $3}'
 program-0.0.1.app
 program-0.0.9.app
 program-0.0.10.app
 program-0.3.1.app
 program-3.3.1.app
 program-3.9.1.app
 program-3.30.1.app

要小心分类。即使使用-n版本1.10.14也会出现问题。请小心排序。即使使用-n版本1.10.14也会出现故障。请小心排序。即使是-n。你的版本是1.10.3,有人总是这么做,这将是不正常的。在排序时要小心。即使是-n。你的1.10.3版(有人总是这么做)将会出问题。