这是我当前的代码:
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
. - 如果它存在并且是一个目录,那就太好了:通过递归写入该目录。
- 如果它存在并且是一个文件,则开始尝试新的数字后缀,直到找到尚不存在的后缀。