繁体   English   中英

如果文件存在,Linux移动文件而不替换

[英]Linux move files without replacing if files exists

在Linux中,如果目标中已存在特定文件,如何在不替换文件的情况下移动文件?

我尝试了以下命令:

mv --backup=t <source> <dest>

该文件没有被替换,但问题是扩展名被更改,因为它在文件名的后面加上“〜”。

有没有其他方法来保留扩展名,但只有文件名在移动时会被更改?

例如test~1.txt而不是test.txt~1

更换扩展后,您不能只通过双击查看文件。

如果你想在shell中创建它,而不需要原子性(所以如果两个shell进程同时运行相同的代码,你可能会遇到麻烦),你只需要(使用你的shell的内置测试(1)功能)

[ -f destfile.txt ] || mv srcfile.txt destfile.txt

如果你需要原子性(当两个进程同时运行它时有效),事情就很困难了,你需要在C中调用一些系统调用。查看renameat2(2)

也许您应该考虑使用像git这样的版本控制系统?

mv有一个选项:

-S, --suffix=SUFFIX
          override the usual backup suffix

您可能会使用; 但是afaik mv没有改变部分文件名但不改变扩展名的功能。 如果您只想使用文本编辑器打开备份文件,可以考虑以下内容:

mv --suffix=.backup.txt <source> <dest>

这将如何工作:假设你有

-rw-r--r-- 1 chris users    2 Jan 25 11:43 test2.txt                                                                                                                                                                                                                           
-rw-r--r-- 1 chris users    0 Jan 25 11:42 test.txt

然后在命令mv --suffix=.backup.txt test.txt test2.txt得到:

-rw-r--r-- 1 chris users    0 Jan 25 11:42 test2.txt                                                                                                                                                                                                                           
-rw-r--r-- 1 chris users    2 Jan 25 11:43 test2.txt.backup.txt

如果移动具有相同文件名的文件,则猜测mv命令非常有限。

下面是可用于移动的bash脚本,如果存在具有相同文件名的文件,则会在文件名后附加一个数字,并且还会保留扩展名以便于查看。

我修改了脚本,可以在这里找到: https//superuser.com/a/313924

#!/bin/bash
source=$1
dest=$2

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

if [[ ! -e "$dest/$basename.$ext" ]]; then
      mv "$source" "$dest"
else
      num=1
      while [[ -e "$dest/$basename$num.$ext" ]]; do
            (( num++ ))
      done
      mv "$source" "$dest/$basename$num.$ext" 
fi 

@aandroidtest:如果你能够依赖一个Bash shell脚本和源目录(目前文件所在的位置)和目标目录(你希望它们移动到哪里)是同一个文件系统,我建议你尝试一下我写的脚本。 您可以在https://github.com/jmmitchell/movestough找到它

简而言之,该脚本允许您将文件从源目录移动到目标目录,同时考虑新文件,重复(相同文件名,相同内容)文件,文件冲突(相同文件名,不同内容),以及复制所需的子目录结构。 此外,该脚本以三种形式处理文件冲突重命名。 例如,如果发现/some/path/somefile.name.ext是冲突文件。 它将被移动到目标目录,其名称类似于以下之一,具体取决于所选择的反冲突样式(通过-u=--unique-style= flag):

  • 默认样式:/some/path/somefile.name.ext- <此处唯一字符串>
  • 样式1:/some/path/somefile.name。<此处的唯一字符串> .ext
  • style 2:/ some / path / somefile。<此处的唯一字符串> .name.ext

如果您有任何疑问,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM