cp/rm/mv等命令强制覆盖操作方式实现

cp/rm/mv等命令强制覆盖操作方式实现

转载:http://www.92csz.com/14/1240.html


习惯了FreeBSD里的cp/rm/mv等命令遇到同名文件时直接覆盖操作,而在linux中(不一定是全部,可能是我使用的几种),使用cp/rm/mv命令覆盖文件操作时总是提示输入yes或no,很是麻烦,一两个的也就算了,没什么,但有时会遇到大量文件的复制时,就麻烦了,要一个一个输入yes才能进行,即使加上了-f参数也无法达到强制覆盖。于是查阅资料后,找到一些小技巧,下面仅以cp命令为例,详细说明

一、使用unalias cp命令 解除对cp的别名(仅本次终端连接会话临时取消),我们先输入alias命令,查看系统内部已经设置的别名

  1. [root@localhost ~]# alias   
  2. alias cp='cp -i'  
  3. alias l.='ls -d .* --color=tty'  
  4. alias ll='ls -l --color=tty'  
  5. alias ls='ls --color=tty'  
  6. alias mv='mv -i'  
  7. alias rm='rm -i'  
  8. alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'  

输入unalias cp命令,取消cp命令的别名

  1. [root@localhost ~]# unalias cp   
  2. [root@localhost ~]# cp filename new/filename   
  3. [root@localhost ~]#   

使用unalias cp命令后,即可使用cp filename new/filename就不会提示输入yes或no了,是不是很方便

二、直接输入\cp命令,作用也是取消cp的别名

  1. [root@localhost ~]# \cp filename new/filename   
  2. [root@localhost ~]#  

是不是比上一个方法更省事
三、使用管道的方式,自动输入yes

  1. [root@localhost ~]# yes | cp filename new/filename   
  2. cp: overwrite `new/filename'? [root@localhost ~]#  

自己替我们输入了yes



简明Linux命令行笔记:mv

重命名、覆盖或移动文件

mv [options] existing-file new-filename

mv [options] existing-file-list directory

mv [options] existing-directory new-directory

 

参数

第一种形式:existing-file 是需要重命名的文件路径; new-filename 是文件的新路径名,用于重命名或覆盖

第二种形式:existing-file 是需要移动的文件路径列表; directory 是文件需要移动到的新目录,用于移动

第三种形式:existing-file 是需要重命名的目录路径; new-directory 是目录的新路径名,用于重命名或覆盖

 

选项

-b                如果已存在相同文件名,则覆盖前进行备份

-f                 如果已存在相同文件名,而用户不具有写的权限,则强制覆盖

-i                 如果已存在相同文件名,覆盖前提示用户进行确认

-u                比较原文件与目标文件修改时间,如果目标文件较新则不覆盖

-v                列出所有被移动或重命名的文件

 

示例

mv

$ mv demo1.txt demo2.txt
$ ls
demo2.txt

重命名文件

 

mv -i

$ ls
demo2.txt  demo.txt
$ mv demo2.txt -i demo.txt 
mv:是否覆盖"demo.txt"? y

对已存在的文件覆盖前进行确认,y或Y开头的字符串表示确定,其余任意字符表示否定

 

mv 不具备写权限的文件名

复制代码
$ ls -l
总用量 0
-rw-r--r-- 1 root root 0  1月  8 13:31 cc
-rw-r--r-- 1 siu  siu  0  1月  8 13:24 dd
$ mv dd cc
mv:是否覆盖"cc",而不理会权限模式0644 (rw-r--r--)? y
$ ls
cc
复制代码

此处cc的所有人和组都是root,而我当前用户是siu,覆盖时会要求确认

 

mv -f 不具备写权限的文件名

复制代码
$ ls -l
总用量 0
-rw-r--r-- 1 root root 0  1月  8 13:34 aa
-rw-r--r-- 1 siu  siu  0  1月  8 13:34 bb
$ mv bb -f aa
$ ls
aa
复制代码

与上面一样,只不过此处加了 -f 选项,覆盖时强制执行而不提示

 

mv 移动目录

复制代码
$ ls
abc  cde
$ mv cde abc
$ ls
abc
$ cd abc/
$ ls
cde
复制代码

此处将cde目录移动到abc目录中

 

mv 重命名目录

$ ls
abc
$ mv abc dir
$ ls
dir

此处将abc目录重命名为dir目录,mv abc ../可将abc移动到父目录,此处灵活多变

 

mv -u

复制代码
$ ls -l
总用量 0
-rw-r--r-- 1 siu siu 0  1月  8 13:43 time1.txt
-rw-r--r-- 1 siu siu 0  1月  8 13:44 time2.txt
$ mv time1.txt -u time2.txt 
$ ls
time1.txt  time2.txt
复制代码

确认修改时间再判断是否覆盖,此处time2.txt的修改时间比time1.txt的修改时间新,所以覆盖失败

 

mv -v

$ mv time1.txt -v time2.txt 
"time1.txt" -> "time2.txt"
$ ls
time2.txt

列出移动或覆盖时的信息

 

mv -b

$ mv -b aa.txt bb.txt
$ ls
bb.txt  bb.txt~

覆盖时进行备份,所备份的文件尾部有个~

 

Tips

1.在Linux中,覆盖和重命名的概念几乎是一样的,没有Windows中所谓的rename这一说法

2.选项你可以写在任意位置,可以mv aa -v bb,也可以 mv -v aa bb,还可以 mv aa bb -v



你可能感兴趣的:(Linux,Shell)