0

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

这仅适用于第一个增量“文件夹/testfile.0”

4

3 回答 3

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只捕获第一行,即使用的最大索引。最后,在第三行中,向这个最大值添加一个以构建新索引。如果列表为空,我的脚本就可以了。

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

于 2013-07-31T16:17:23.910 回答
1

问题是您的while循环由于使用管道而在子shelln中执行,因此您的修改无法按预期工作。

一般来说,您可以使用进程替换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}
于 2013-07-31T15:31:33.997 回答
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}
于 2016-10-27T10:20:43.493 回答