我正在建立一个列表来删除旧文件并保留最新的5个版本,其中从列表中删除了文件量。
GNU bash,v4.3.48
文件:测试
"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"测试子外壳:
$ cat test | sed -r 's/.*-([0-9]+\.tgz).*/\1/g' | sort -n | tail -n 5 | xargs| sed 's/ /|/g;s/^/\"/g;s/$/\"/g'结果(保留的文件):
"15.tgz|16.tgz|17.tgz|18.tgz|19.tgz"命令忽略5个文件。
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')结果(要删除的文件):
"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。
发布于 2019-09-02 20:42:37
不要两次通过,一次就够了。您不需要“先提取要保留的索引”,然后再“将要保留的索引与所有索引的列表连接起来,并删除不相交的组”。同时执行这两项操作,只是在流过时对其进行处理。
下面的脚本带有代码中的注释:
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输出:
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前面的数字,然后将它们放在带有文件名的文件中。然后对列表进行排序并删除索引。
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 |.https://stackoverflow.com/questions/57757023
复制相似问题