每次在工作目录中运行脚本时,我都会生成文件(testfile)。我必须将生成的文件复制到目录(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}
这仅适用于第一个增量“folder / testfile.0”
答案 0 :(得分:2)
我不会纠正你的解决方案,因为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
只捕获第一行line,即最大的使用指数。最后,在第三行中,添加一个到此最大值以构建新索引。如果列表为空,我的脚本就可以了。
顺便说一下,列出一个目录可能会很长,所以我建议你存储一下你以后使用的最后一个索引。将其保存为脚本中的变量,甚至保存在文件中......它也可以节省一些时间。
答案 1 :(得分:1)
问题是由于使用了管道,您的while
循环在子shell 中执行,因此您对n
的修改无法按预期工作。
一般情况下,您可以将process substitution与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}
答案 2 :(得分:0)
另一个建议 - 易于理解的代码:
#!/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}