Linux下rm删除文件(文件夹)失败的解决

Linux下删除文件的命令是rm,使用起来非常简单

rm test.txt

像这样就删除了test.txt这个文件。说起来简单,实际在删除文件夹(文件)的操作中常常会遇到很多小问题,下面我逐一给出解决方案:


问题1:删除文件夹时失败,错误提示:

mkdir test
rm test
rm: cannot remove `test': Is a directory

上面先新建了一个文件夹test,再尝试删除它,结果遇到报错。

解决:rm命令的作用是删除文件,真正删除文件夹的其实应该是rmdir命令。但是我们习以为常的用rm来删除,就会看到这个报错了。解决办法是给rm加上-r参数:

rm -r test

 

问题2:删除文件不断让确认,提示:

#t文件夹中有1、2、3、4四个文件
rm -r t
rm: descend into directory `t'? y
rm: remove regular empty file `t/4'? y
rm: remove regular empty file `t/1'? y
rm: remove regular empty file `t/2'? y
rm: remove regular empty file `t/3'? y
rm: remove directory `t'? y

4个文件还可以逐个按y确认删除,如果数量再多就没有办法做到了。

解决:出现这种情况的原因是CentOS等Linux发行版基于安全方面的考虑,对rm做了一个alias别名处理,执行这个命令可以看到:

alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'                  #<---------------------原因就是这个alias
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

-i的意思是删除每个文件前确认(prompt before every removal)

问题找到了,如何解决呢?有两个办法:

办法1:加上-f参数,-f的意思是不用确认强行删除(ignore nonexistent files, never prompt)

rm -rf t

办法2:绕过在命令前加反斜线的方式绕过系统alias

\rm -r t


问题3:删除文件失败,提示权限不够

rm /root/a
rm: cannot remove `/root/a': Permission denied

这种情况就比较麻烦,不是一句话两句话能搞清楚的了。删除一个文件,实际上是在它所在的文件夹里执行命令,所以当前登录用户要有这个文件夹的执行权限。

解决:这种情况通常用sudo临时获得root权限(当然了前提是有权sudo)。如果既没有sudo权限,又有删除文件的需求,那说明这台服务器的权限分配不合理,只能找系统管理员解决。


问题4:删除超大文件夹没有响应(慢)

有一个文件夹超大上百GB,里面的文件都是海量小文件(<10KB),通常如果用文件做缓存就会出现这种情况。如果因为某些原因要删除这个文件夹,那可麻烦了,因为删除超大文件非常慢:执行一个rm操作需要几十分钟是常有的事。

而执行的过程中如果终端窗口关掉,那这个命令就执行失败了,在网络不好的时候重试多少次都无法完成。

解决:nohup命令可以让服务器在后台执行命令,不必开着终端窗口,以删除文件夹为例:

nohup rm a &
[1] 28898
nohup: ignoring input and appending output to `nohup.out'

这里的28898是进程ID,记下这个数字,通过下面的命令了解进程状态:

top -p 28898

如果对应的进程已经没有了,就说明已经执行完了(或者出错了)。程序的回显会写入到nohup.out文件中,对rm命令来说通常没有回显。


问题5:删除超大文件夹报错

bash: /bin/rm: Argument list too long

这种情况比问题4还严重一些,问题4是慢但最终也能删除完,而出现这个报错就说明删除执行不下去了。

解决:把删除一个文件夹的操作拆分成逐一删除N多个小文件,具体的命令是:

ls | xargs -n 10 rm -fr

还可以用find命令的-exec参数,原理大同小异。


问题6:如何最快速度简单粗暴的删除一个超大文件夹

上面的方法提供了更高的灵活度,如果只删除特定文件则稍加修改就可以实现。但如果目的明确就是要彻底删除一个文件夹的所有内容,而且服务器上有rsync命令,还有更快的方式:

which rsync
/usr/bin/rsync
#如果是上面这个结果,这就说明已经有了

/usr/bin/which: no rsync in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
#如果是上面这个结果,就说明没有rsync,就不能用这个办法了

如果rsync命令已经安装,而我们要清空的是/home/test/big/这个目录,用这个命令是最快的:

mkdir tmp_del && rsync -a --delete tmp_del/ 这里是要清空的文件夹/ && rmdir tmp_del

这个命令的原理和上面的所有命令都不一样,它直接用另一个空文件夹来替换掉目标文件夹,速度最快,如果服务器装有rsync命令的话,这是删除大文件夹的最佳选择。

 评论
 发表评论
姓   名: