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

时间:2009-01-22 18:07:32

标签: 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
./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`

但我不知道如何过滤此列表以使所有文件“在特定版本之后或之后”。

4 个答案:

答案 0 :(得分:4)

echo 1.2.3 | awk -F'.' '{ ver=1000000*$1 + 1000*$2 + $3; if (ver > 1002001) print $_ }'

答案 1 :(得分:2)

蛮力(与正则表达式匹配的模式):

find . -name "*.sql" | egrep -v "1\.[0-8]|1\.9\.[0-3]"

使用sed的方式更好:

% find . -name "*.sql" | sort -r | sed '/1\.9\.4/ {q}'
...
./scripts/1.9.6/script-1.9.6.sql
./scripts/1.9.6.1/script-1.9.6.1.sql
./scripts/1.9.5/script-1.9.5.sql
./scripts/1.9.4/script-1.9.4.sql

说明:反向排序,然后使用sed在版本(1.9.4)匹配的瞬间停止处理输入。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这是一个基于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.9之前的通知0.0.10,这是错误的)。但是,如果我们执行一些“版本数学”,我们会得到正确的顺序:

 $ 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