对于增量扩展的Unix shell脚本(Unix shell script for incremen

2019-10-30 10:18发布

我有文件中获取生成(testfile的)eachtime一个脚本在工作目录中运行。 我要生成的文件复制到一个目录(testfolder),并经一个.EXT递增

如果脚本运行的第一次,然后复制到testfile将作为testfolder“testfile.0”,当运行第二次复制testfile的以testfolder为“testfile.1”等。

我的脚本:

#!/bin/sh

file="testfile"
n=1

ls folder/${file}* | while read i
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
 done

 cp testfile folder/${file}.${n}

这只是第一个增量“的文件夹/ testfile.0”工作

Answer 1:

我不会纠正你的解决方案,因为mklement0是否良好。

这里是另一种解决方案,无需任何循环:

file="testfile"
n_max=$(ls -1 "folder/${file}"* | egrep -o '[0-9]+$' | sort -rn | head -n 1)
cp "${file}" "folder/${file}.$((n_max+1))"

这里是第二行的事情:首先你列出的文件,然后egrep提取数字扩展,然后sort -rg递减排序他们,最后head抓只在第一行,也就是最大的二手指数。 最后,在第三行,你添加一个到这个最大值来构建新的索引。 这是确定我的剧本,如果该列表是空的。

顺便说一句,列出一个目录可能会很长,所以我建议你在一些地方保存您用于以后使用的最后一个索引。 将它保存为脚本变量,甚至在文件中...它可以节省你还有些时间。



Answer 2:

问题是你的while循环是在子shell由于使用管道的执行,所以您的修改n按预期不起作用。

在一般情况下,你可以使用进程替换用while为了避免这个问题,但在当前情况下一种简单for循环是正确的做法:

#!/bin/sh

file="testfile"
n=1

for i in folder/${file}*
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
done

cp testfile folder/${file}.${n}


Answer 3:

只是一个建议 - 在易于理解的代码:

#!/bin/bash

file="testfile"
n=1

# Check for existing files with filename and count it
n=$(ls -latr folder/ |grep -i ${file} | wc -l)

# Increment above number
n=$(( $n + 1 ))

# Copy over file with the incremented number
cp $file folder/${file}.${n}


文章来源: Unix shell script for increment the extension