Unix shell脚本用于增加扩展名

时间:2013-07-31 15:18:37

标签: bash shell unix loops while-loop

每次在工作目录中运行脚本时,我都会生成文件(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”

3 个答案:

答案 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 substitutionwhile一起使用以避免此问题,但在当前情况下,一个简单的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}