我有文件中获取生成(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”工作
我不会纠正你的解决方案,因为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
抓只在第一行,也就是最大的二手指数。 最后,在第三行,你添加一个到这个最大值来构建新的索引。 这是确定我的剧本,如果该列表是空的。
顺便说一句,列出一个目录可能会很长,所以我建议你在一些地方保存您用于以后使用的最后一个索引。 将它保存为脚本变量,甚至在文件中...它可以节省你还有些时间。
问题是你的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}
只是一个建议 - 在易于理解的代码:
#!/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}