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