移动时重命名同名文件

移动时重命名同名文件

这是我当前的代码:

Base_DIR=/file/path
other= /folder/path
find "Base_DIR" -type f -name "*.txt"
while IFS= read -r file; do
year="$(date -d "$(stat -c %y "$file")" +%Y
month="$(date -d "$(stat -c %y "$file")" +%m
day="$(date -d "$(stat -c %y "$file")" +%d

[[ ! -d "$other/$year/$month/$day" ]] && mkdir -p "$other/$year/$month/$day";

mv "$file" "$other/$year/$month/$day`

因此,它基本上会从不同的子目录中查找文件,并将文件移动到不同的文件夹中,同时根据文件上次修改的年、月和日创建文件夹。

我的问题是如何添加此内容,以便当我移动具有相同名称的文件时,它会自动将文件重命名为,例如 file(1).txt。现在,代码仅复制其中 1 个文件,而不是同时复制两个文件。

谢谢。

答案1

mv --backup=t file directory/

您应该获得名为 file、file.~1~、file.~2~ 等的文件。

答案2

尽管您问题中的代码根本不起作用,但为了解决“如何通过添加数字后缀无损地移动文件”的问题,类似于此的操作可能会起作用:

$ cat mvr.sh
#!/usr/bin/env bash

bail() {
   retcode=$1
   shift
   printf "%s" "$*" 1>&2
   exit "$retcode"
}

[[ -f "$1" ]] || bail 1 "File '$1' not found"

if ! [[ -f "$2" ]]; then
   mv "$1" "$2"
else
   if [[ -d "$2" ]]; then
      $0 "$1" "${2}/${1}"
      exit $?
   else
      suffix=1
      until ! [[ -f "${2}.$suffix" ]]; do
         suffix=$((suffix+1))
      done
      mv "$1" "${2}.$suffix"
   fi
fi

行动中:

$ ls
bar    bar.1  bar.2  mvr.sh
$ touch foo; ls
bar    bar.1  bar.2  foo    mvr.sh
$ ./mvr.sh foo bar
$ ls
bar    bar.1  bar.2  bar.3  mvr.sh

如何做到这一点的真正核心是从if声明开始的。

  • 如果目标文件名尚不存在,那就太好了,只需mv.
  • 如果它存在并且是一个目录,那就太好了:通过递归写入该目录。
  • 如果它存在并且是一个文件,则开始尝试新的数字后缀,直到找到尚不存在的后缀。

相关内容