首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子Subshell结果与预期结果不同

子Subshell结果与预期结果不同
EN

Stack Overflow用户
提问于 2019-09-02 20:33:40
回答 1查看 37关注 0票数 0

我正在建立一个列表来删除旧文件并保留最新的5个版本,其中从列表中删除了文件量。

GNU bash,v4.3.48

文件:测试

代码语言:javascript
复制
        "npm/usagecontrol-ui/usagecontrol-ui-0b7c6c7f-17.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-0c77b6bf-15.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-191743df-10.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-2fa8b89d-14.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-4fdca5ca-18.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-5bd9abf4-7.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-6a6743ee-11.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-9d47b9a5-16.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-bc77eec4-19.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-cfd66059-12.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-d136baa3-13.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-ffa49b6b-9.tgz"

测试子外壳:

代码语言:javascript
复制
$ cat test | sed -r 's/.*-([0-9]+\.tgz).*/\1/g' | sort -n | tail -n 5 | xargs| sed 's/ /|/g;s/^/\"/g;s/$/\"/g'

结果(保留的文件):

代码语言:javascript
复制
"15.tgz|16.tgz|17.tgz|18.tgz|19.tgz"

命令忽略5个文件。

代码语言:javascript
复制
cat teste | grep -vE $(cat teste | sed -r 's/.*-([0-9]+\.tgz).*/\1/g' | sort -n | tail -n 5 | xargs| sed 's/ /|/g;s/^/\"/g;s/$/\"/g')

结果(要删除的文件):

代码语言:javascript
复制
        "npm/usagecontrol-ui/usagecontrol-ui-0c77b6bf-15.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-191743df-10.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-2fa8b89d-14.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-5bd9abf4-7.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-6a6743ee-11.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-cfd66059-12.tgz", 
        "npm/usagecontrol-ui/usagecontrol-ui-d136baa3-13.tgz",

grep -vE选择要删除的15.tgz。但我希望15.tgz能保留下来。如16.tgz、17.tgz、18.tgz和19.tgz。

EN

回答 1

Stack Overflow用户

发布于 2019-09-02 20:42:37

不要两次通过,一次就够了。您不需要“先提取要保留的索引”,然后再“将要保留的索引与所有索引的列表连接起来,并删除不相交的组”。同时执行这两项操作,只是在流过时对其进行处理。

下面的脚本带有代码中的注释:

代码语言:javascript
复制
cat <<EOF |
        "npm/usagecontrol-ui/usagecontrol-ui-0b7c6c7f-17.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-0c77b6bf-15.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-191743df-10.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-2fa8b89d-14.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-4fdca5ca-18.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-5bd9abf4-7.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-6a6743ee-11.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-9d47b9a5-16.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-bc77eec4-19.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-cfd66059-12.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-d136baa3-13.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-ffa49b6b-9.tgz"
EOF
# extract the strings inside "
sed -r 's/[[:space:]]*"([^"]*).*/\1/' |
# sort using the numbers
# sort using `-` as the separator for fields and sort using 5th field
sort -t- -n -k5,5 |
# remove 5 newest files
head -n -5  |
# remove the rest of the files
xargs echo rm

输出:

代码语言:javascript
复制
rm npm/usagecontrol-ui/usagecontrol-ui-5bd9abf4-7.tgz npm/usagecontrol-ui/usagecontrol-ui-ffa49b6b-9.tgz npm/usagecontrol-ui/usagecontrol-ui-191743df-10.tgz npm/usagecontrol-ui/usagecontrol-ui-6a6743ee-11.tgz npm/usagecontrol-ui/usagecontrol-ui-cfd66059-12.tgz npm/usagecontrol-ui/usagecontrol-ui-d136baa3-13.tgz npm/usagecontrol-ui/usagecontrol-ui-2fa8b89d-14.tgz

如果您不确定文件名中的数字-,更好的方法是首先提取[0-9]*.tgz前面的数字,然后将它们放在带有文件名的文件中。然后对列表进行排序并删除索引。

代码语言:javascript
复制
cat <<EOF |
        "npm/usagecontrol-ui/usagecontrol-ui-0b7c6c7f-17.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-0c77b6bf-15.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-191743df-10.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-2fa8b89d-14.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-4fdca5ca-18.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-5bd9abf4-7.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-6a6743ee-11.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-9d47b9a5-16.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-bc77eec4-19.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-cfd66059-12.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-d136baa3-13.tgz",
        "npm/usagecontrol-ui/usagecontrol-ui-ffa49b6b-9.tgz"
EOF
# extract the strings inside "
sed -r 's/[[:space:]]*"([^"]*).*/\1/' |
# extract the index in front of .thz and put it in front of the line
sed -r 's/^.*-([0-9]*)\.tgz$/\1 &/' |
# sort using the extracted numbers
sort -n -k1,1 |
# remove the indexes
cut -d' ' -f2- |
# remove 5 newest files
head -n -5  
# remove the rest of the files
xargs echo rm

备注:

  • s/ /|/g;s/^/\"/g;s/$/\"/g -转义单引号内的双引号不做任何事情。这和s/ /|/g;s/^/"/g;s/$/"/g.
  • | xargs|是无用的一样,它是一个空操作。它几乎等同于| cat |.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57757023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档