当目标文件夹中存在文件时移动文件和重命名

Juk*_*aav 5 bash shell-script macos

我曾经用Hazel做这个。我想一切从运动~/Downloads/~/Downloads/Archive/Pictures~/Downloads/Archive/Documents~/Downloads/Archive/Videos等基于文件扩展名,当具有相同名称的文件已经存在,榛只会追加一个数字,它是移动文件。

我想编写一个可以实现此目的的 shell 脚本,但我很快意识到我不知道如何在没有任何用户输入的情况下重命名文件。重命名方案可以是文件名后的一个简单计数器,它应该只在mv覆盖现有文件时发生。如果已经有许多具有相同文件名的实例,它也应该能够继续计数器。所以,如果我移动dirA/file.extdirB/一个已经file.extfile2.ext它的脚本应该在3开始计数,并重新命名dirA/file.extdirB/file3.ext

任何人都可以就如何实现这一目标提供任何指导吗?最好使用 shell 脚本,如果没有,则使用 Ruby、Perl 或 Python。只是知道这是否可以用 shell 脚本来帮助我。

gle*_*man 8

这并不难。如果目标文件存在,您只需要将文件分解为基本名称和扩展名,并增加一个计数器,直到目标目录中不存在新文件名。

source=dirA/file.ext
dest_dir=dirB

file=$(basename file.ext)
basename=${file%.*}
ext=${file##*.}

if [[ ! -e "$dest_dir/$basename.$ext" ]]; then
    # file does not exist in the destination directory
    mv "$source" "$dest_dir"
else
    num=2
    while [[ -e "$dest_dir/$basename$num.$ext" ]]; do
        (( num++ ))
    done
    mv "$source" "$dest_dir/$basename$num.$ext" 
fi 
Run Code Online (Sandbox Code Playgroud)

  • 不,这并不难。但考虑到这是一项日常任务(与可以自行完成上述任务的 Windows 资源管理器相比),我发现 mv 中没有任何与此类似的内容。 (2认同)