【问题标题】:Bash Move file and rename with incrementing extensionBash 移动文件并使用递增扩展名重命名
【发布时间】:2015-01-06 04:41:01
【问题描述】:

我必须编写一个 Bash 脚本来查看文件是否存在并将文件移动到特定目录,然后如果 .1 已经存在,则使用扩展名 .1 或 .2 等重命名文件。我觉得我有一个好的开始,但即使我可以直接输入 mv 文件目标并且它可以工作,它也无法识别目录。我哪里错了?

#!/bin/bash
DESTINATION="~hbrown31/homework"
FILE=$1
if [ -e "$FILE" ]
 then
  for $FILE in 'ls|sort -g -r'
   do
    echo "File is being moved and renamed"
    NEWFILE="$DESTINATION""$FILE""."
    mv "$FILE" "$(NEWFILE + 1)"
   fi
 else
  echo "File does not exist"
fi

【问题讨论】:

  • 你可能需要一个最终的/ DESTINATION,或者使用“$DESTINATION/$FILE”
  • 另外,$DESTINATION$FILE 可能不是整数,那么增加它是什么意思?
  • 正确。我错过了目标路径中的最后一个 / 。当我移动文件时,我必须将 .number 添加到文件名的末尾。如果 .1 已经存在,那么我必须使它成为 .2
  • 您确定需要引用DESTINATION 中的波浪号前缀吗?我猜你想要:DESTINATION=~hbrown31/"homework"

标签: bash unix rename move increment


【解决方案1】:

我并不完全清楚你想要什么(我不明白'ls|sort',但我认为你正在寻找类似的东西:

#!/bin/bash
DEST=~hbrown31/homework  # Do not quote or the ~ will not be expanded

move() {
  suffix=0
  file="$DEST/$1"
  while test -e "$file"; do
    file="$DEST/$1.$((++suffix))"
  done
  mv -v "$1" "$file"
}

for x; do move "$x"; done

请注意,mv 的某些版本确实支持诸如 -b--backup 之类的选项,它们实际上可能会为您完成大部分工作。

【讨论】:

  • : $((suffix += 1 )) 很可爱,但((suffix+=1)) 甚至((++suffix)) 就足够了;)
  • @gniourf_gniourf 我喜欢使用正确的增量形式。
  • 后缀 += 1 更具表现力。它说明正在做什么而不是依赖副作用。如果将其写为单行,则使用后增量是合适的:file="$DEST/$1.$((++suffix))
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 2016-11-06
  • 2012-01-02
  • 2015-12-12
  • 2016-02-25
  • 2016-05-22
  • 2018-08-31
  • 1970-01-01
相关资源
最近更新 更多