Linux在不替换文件的情况下移动文件(如果文件存在)

Linux在不替换文件的情况下移动文件(如果文件存在),linux,mv,Linux,Mv,在Linux中,如果目标中已经存在特定文件,如何在不替换的情况下移动文件 我尝试了以下命令: mv --backup=t <source> <dest> mv--backup=t 文件没有被替换,但问题是扩展名被更改,因为它将“~”放在文件名的后面 是否有其他方法保留扩展名,但在移动时仅更改文件名 例如。 test~1.txt而不是test.txt~1 当扩展名被替换时,您不能通过双击来查看文件。如果您想在shell中创建文件,而不需要原子性(因此,如果两个shell

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

我尝试了以下命令:

mv --backup=t <source> <dest>
mv--backup=t
文件没有被替换,但问题是扩展名被更改,因为它将“~”放在文件名的后面

是否有其他方法保留扩展名,但在移动时仅更改文件名

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


当扩展名被替换时,您不能通过双击来查看文件。

如果您想在shell中创建文件,而不需要原子性(因此,如果两个shell进程同时运行相同的代码,您可能会遇到麻烦),您可以(使用shell的内置功能)

如果您需要原子性(当两个进程同时运行它时,它就可以工作),那么事情就相当困难了,您需要在C中调用一些系统调用


也许你应该考虑使用一些版本控制系统,比如

< P> <代码> MV 有一个选项:

-S, --suffix=SUFFIX
          override the usual backup suffix
你可以用它;但是,afaik
mv
没有更改部分文件名而不是扩展名的功能。如果你只想用文本编辑器打开备份文件,你可以考虑如下:

mv --suffix=.backup.txt <source> <dest>
然后在命令
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脚本,如果存在具有相同文件名的文件,它将在文件名后附加一个数字,并且还保留扩展名以便于查看

我修改了可以在此处找到的脚本:


@aandroidtest:如果您能够依赖bashshell脚本,并且源目录(文件当前所在的位置)和目标目录(您希望它们移动到的位置)是同一个文件系统,那么我建议您尝试我编写的脚本。你可以在

简而言之,该脚本允许您将文件从源目录移动到目标目录,同时考虑新文件、重复(相同文件名,相同内容)文件、文件冲突(相同文件名,不同内容)以及复制所需的子目录结构。此外,该脚本以三种形式处理文件冲突重命名。例如,
/some/path/somefile.name.ext
被发现为冲突文件。根据所选的消除冲突样式(通过
-u=
--unique style=
标志),它将被移动到目标目录,名称如下所示:

  • 默认样式:/some/path/somefile.name.ext-
  • 样式1:/some/path/somefile.name..ext
  • 样式2:/some/path/somefile..name.ext

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

我想您知道
-n
选项到
mv
?这不是你想要的(因为如果目的地存在,它根本不起作用),但可能是你需要的……我很确定
mv
(以及类似的工具,如
cp
ln
)从来不会以任何方式解释文件名。因此,它对
没有任何特殊意义,它唯一要做的转换就是附加一个备份后缀。这是一件好事。如果您想要一些不同的东西,那么Bash或Perl脚本可能是最好的选择。@TobySpeight我不是说mv可以解释任何东西。我清楚地说,“afaik mv没有更改部分文件名的功能,但没有更改扩展名的功能”。我加了一个例子来说明我的主张;但我同意这并不是安卓测试想要的100%。我不是在争论——我的评论只是对你答案的补充。仅提供额外信息,供提问者解释为什么
mv
不能保留现有后缀。如果我对你的回答有异议,那我很抱歉@托比斯佩特我没有生气:)只是觉得我的回答不够清楚,或者我错过了什么……好吧;除非你自己开始写剧本,否则这是不可能的;按照Basile的建议…OP希望重命名文件而不触及其扩展名。这并不能回答问题。这需要
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
-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
#!/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