命令行:如果文件名已经存在,则使用新文件名创建文件


8

我想知道是否有可能创建一个文件的命令,但是每次执行该命令时,它都不会覆盖前一次执行中创建的文件。

例如:touch test1.txt将创建1个名为的文件test1.txt。但是,下次执行该文件时,我希望将新文件称为test2.txt或类似的名称。因此,无需覆盖现有文件。在某种程度上,它可以多次执行而不会出现问题。

别误会我,我不是想用一个命令来创建多个文件。

提前致谢!

Answers:


9

最简单的解决方案是在文件名中添加时间戳,而不使用一位数字。

创建空文件的最简单方法是touch test$(date +%Y%m%d-%H%M%S),这将导致名为的文件test20110802-170410。第二次test*会获得更新的时间戳,因此将产生2个文件。


这就是我一直在寻找的东西,谢谢!:)
Nick Lemaire

在脚本中不起作用(不等待)-我尝试过touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S),它仅创建了一个文件。纳秒级的工作原理:touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)并分别touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)创建两个文件。
Volker Siegel 2014年

最好使用,$()因为它允许您嵌套表达式,但也可以使用反引号: touch test`date +%Y%m%d-%H%M%S`
巴勃罗·比安奇

5

我怀疑是否存在执行此操作的通用命令,但是您可以想到以下内容:

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

该函数的输入参数分为前缀,数字,后缀,然后直到文件存在,数字都会递增。找到一个空闲插槽,使用创建文件touch

拆分机制应适合您的需求,并应添加各种错误检查。


辉煌,功能强大。
Marco Ceppi

1

如果不需要序列号,那么最简单的方法是使用mktemp命令。


mktemp使用模板生成一个随机的唯一文件名。您可能会在变量中捕获mktemp的输出。来自linuxmanpagesTMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan 2011年

另一个常见的方法是使用当前进程ID,它来自shell变量$$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.