Linux 下/bin/rm: Argument list too long 解决方法(最全)

本文将会通过不同方法来解决在Linux命令行下通过rm命令删除大批量文件的时候遇到的“Argument list too long”的问题。 因为linux命令对传入的参数个数有限制,所以超过限制的时候,系统就会输出参数过长的问题。

查看命令行参数允许的长度大小

执行命令如下:

#getconf ARG_MAX

命令输出如下:

root@devops:~# getconf ARG_MAX
2097152

通过AWK命令结合RM命令来删除大批量文件

当通过rm命令直接删除大批量文件的时候,系统会报错,那么可以将rm命令结合AWK命令来进行删除操作,避免“/bin/rm: Argument list too long”的问题。

例如要删除当前目录下所有文件,执行下面命令:

# ls -l |awk '{print "rm -rf" , $9}'| sh

命令输出如下:

root@devops:~/osetc# ls -l
总用量 24
-rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt
-rw-r--r-- 1 root root     0 3月  24 23:53 fio.txt

root@devops:~/osetc# ls -l |awk '{print "rm -rf" , $9}'| sh
root@devops:~/osetc# ls -l
总用量 0

通过xargs命令结合rm命令删除大批量文件

我们可以通过执行ls命令将要删除命令列出,并将其输出通过管道符传给xargs命令,然后再调用rm命令来删除传过来的文件,进而解决 “/bin/rm: Argument list too long”的问题。执行命令如下:

# ls | xargs rm -rf

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio.txt
root@devops:~/osetc# ls | xargs rm -rf
root@devops:~/osetc# ls

通过find命令结合xargs命令来删除大批量文件

我们也可以通过find命令查找要删除的文件,然后将查找到的文件传给xargs命令,并通过rm命令删除,这样也可以解决“/bin/rm: Argument list too long”的问题。

执行下面的命令:

# find ./ -name "*.txt" | xargs rm -rf

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio.txt

root@devops:~/osetc# find ./ -name "*.txt" | xargs rm -rf
root@devops:~/osetc# ls
root@devops:~/osetc#

通过自定义shell脚本来删除大批量文件

我们也可以通过自己编写一个shell 脚本来实现大批量文件的删除,比如通过for循环来删除每个文件,这也就可避免““/bin/rm: Argument list too long”的问题。

要执行的脚本如下:

#!/bin/bash

DIR='/root/osetc'  # 指定要删除的文件的目录
cd $DIR   # 切换目录到指定删除文件的目录
for I in `ls`
do      #将ls命令的输出传给for循环
    rm -rf $I
done

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio.txt

root@devops:~# vi delF.sh

root@devops:~# chmod u+x delF.sh

root@devops:~# ./delF.sh

root@devops:~# ls /root/osetc/
root@devops:~#

99%的人还阅读了:

5 种Linux下清空大文件的方法(删除大文件内容)

本文将会讲述如何在linux系统下清空大文件或者说删除大文件内容的5种不同的方法。 当我们想要清空一个大文件里的内容的时候,我们通常会通过vi编辑器打开这个文件,然后将其内容删除,但是如果文件内容太多,或者文件太大的话,打开文件有可能会很慢或者清空文件的内容会很费时间。 下面我们将会介绍5种简单易用的清空文件的内容的方法呢?

通过重定向来清空文件内容

在linux清空普通文件内容尤其是大文件内容,最简单的方法是通过重定向来实现, 比如要清空当前目录下的大文件fio.txt 内容,执行下面的命令:

# > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:35 fio.txt

root@devops:~/osetc# >fio.txt

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:36 fio.txt

 通过true命令重定向清空文件

通过true命令的输出结果重定向到指定要清空的大文件里,执行命令如下:

#true > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:42 fio.txt

root@devops:~/osetc# true > fio.txt

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:42 fio.txt

通过cat /dev/null 设备重定向来清空文件内容

Linux 下的/dev/null 文件是一种特设的设备文件,该命令可以将任何写入其中的数据丢弃掉。 我们可以将该空设备的输出重定向到要清空的大文件里,就可。 执行下面的命令:

#cat /dev/null > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:42 fio.txt

root@devops:~/osetc# true > fio.txt

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:42 fio.txt

通过echo命令清空文件内容

使用echo命令将一个空字符串重定向到指定的文件,也可以将该文件清空。

执行命令:

#echo “ “ > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:50 fio.txt

root@devops:~/osetc# echo "" >fio.txt

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1 3月  24 23:51 fio.txt

通过truncate 命令清空内容

通过linux下truncate命令将指定的文件大小缩小到给定的大小,比如大小为0,这样就达到清空文件的内容的目的。

执行下面的命令:

#truncate –s 0 fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:53 fio.txt

root@devops:~/osetc# truncate -s 0 fio.txt

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:53 fio.txt

root@devops:~/osetc#

99%的人还阅读了:

5种Linux下安全删除文件的软件工具(最新)

本文主要讲述Linux系统下5种不同的安全删除文件工具的用法介绍。 通常情况下,我们在Linux系统下删除文件的主要方法是通过rm命令或者unlink命令进行删除。 但是正如我们之前介绍过的rm命令删除文件的原理,该命令只是将文件所对应的inode链接删除,但是文件在磁盘存储的数据依然还在,这样就有可能造成数据的泄露。 下面我们会介绍5种Linux系统下永久安全的从磁盘中删除文件数据的工具。

Shred 删除工具

Shred工具主要是通过多次的覆盖文件的方式来达到安全删除文件的目的。

Shred 工具用法及选项

用法如下:

Shred [选项]  文件名

选项如下:

-f, --force           必要时修改权限以使目标可写
-n, --iterations=N    覆盖N 次,而非使用默认的3 次
--random-source=文件      从指定文件中取出随机字节
-s, --size=N          粉碎数据为指定字节的碎片(可使用K、M 和G 作为单位)
-u             truncate and remove file after overwriting
--remove[=HOW]  like -u but give control on HOW to delete;  See below
-v, --verbose  show progress
-x, --exact    do not round file sizes up to the next full block;
this is the default for non-regular files
-z, --zero     add a final overwrite with zeros to hide shredding
--help            显示此帮助信息并退出
--version         显示版本信息并退出

实例:删除当前目录下的文件fio.txt, 执行下面的命令:

# shred -zvu -n 3 fio.txt

命令输出如下:

root@devops:~/osetc# shred -zvu -n 3 fio.txt
shred: fio.txt:正在删除
shred: fio.txt:名称已更改为 0000000
shred: 0000000:名称已更改为 000000
shred: 000000:名称已更改为 00000
shred: 00000:名称已更改为 0000
shred: 0000:名称已更改为 000
shred: 000:名称已更改为 00
shred: 00:名称已更改为 0
shred: fio.txt:已删除

Wipe删除工具

接下来要介绍的第二种安全删除文件的工具是wipe, 该工具可以安全的删除指定磁盘上的文件,当文件被删除后,是无法再恢复的。

安装wipe工具

执行下面的命令:

#sudo apt-get install wipe

命令输出如下:

root@devops:~/osetc# apt-get install wipe
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
java-common libappindicator1 libindicator7 Linux-headers-4.10.0-28
Linux-headers-4.10.0-28-generic Linux-image-4.10.0-28-generic
Linux-image-extra-4.10.0-28-generic
使用'apt autoremove'来卸载它(它们)。
下列【新】软件包将被安装:
wipe
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 205 个软件包未被升级。
需要下载 41.8 kB 的归档。
解压缩后会消耗 128 kB 的额外空间。
获取:1 http://mirrors.aliyun.com/ubuntu xenial/universe amd64 wipe amd64 0.22-3 [41.8 kB]
已下载 41.8 kB,耗时 0秒 (268 kB/s)
正在选中未选择的软件包 wipe。
(正在读取数据库 ... 系统当前共安装有 290931 个文件和目录。)
正准备解包 .../archives/wipe_0.22-3_amd64.deb  ...
正在解包 wipe (0.22-3) ...
正在处理用于 man-db (2.7.5-1) 的触发器 ...
正在设置 wipe (0.22-3) ...

实例,安全删除当前目录下的文件fio.txt, 执行下面的命令:

wipe -rfi fio.txt

命令输出如下:

root@devops:~/osetc# wipe -rfi fio.txt
File fio.txt (0 bytes) wiped
Operation finished.
1 file wiped and 0 special files ignored in 0 directories, 0 symlinks removed but not followed, 0 errors occured.

Secure-delete删除文件工具

接下来要介绍的是一款名叫secure-delete的安全文件删除工具集合,该集合里包含用来安全删除指定文件的工具叫srm

安装secure-delete 工具集

执行下面的命令:

#sudo apt-get install secure-delete

命令输出如下

root@devops:~/osetc# sudo apt-get install secure-delete
sudo: 无法解析主机:devops
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
java-common libappindicator1 libindicator7 Linux-headers-4.10.0-28
Linux-headers-4.10.0-28-generic Linux-image-4.10.0-28-generic
Linux-image-extra-4.10.0-28-generic
使用'sudo apt autoremove'来卸载它(它们)。
下列【新】软件包将被安装:
secure-delete
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 205 个软件包未被升级。
需要下载 62.7 kB 的归档。
解压缩后会消耗 161 kB 的额外空间。
获取:1 http://mirrors.aliyun.com/ubuntu xenial/universe amd64 secure-delete amd64 3.1-6ubuntu1 [62.7 kB]
已下载 62.7 kB,耗时 0秒 (365 kB/s)
正在选中未选择的软件包 secure-delete。
(正在读取数据库 ... 系统当前共安装有 290943 个文件和目录。)
正准备解包 .../secure-delete_3.1-6ubuntu1_amd64.deb  ...
正在解包 secure-delete (3.1-6ubuntu1) ...
正在处理用于 man-db (2.7.5-1) 的触发器 ...
正在设置 secure-delete (3.1-6ubuntu1) ...

如果要删除当前目录下的fio.txt文件,可以执行下面的命令:

#srm –vz fio.txt

命令输出如下:

root@devops:~/osetc# srm -vz fio.txt
Using /dev/urandom for random input.
Wipe mode is secure (38 special passes)
Wiping fio.txt ************************************** Removed file fio.txt ... Done

Sfill 安全删除文件工具

Sfill工具是secure-delete工具集里的一个安全删除文件的另一个工具,该工具主要用来安全的删除磁盘上所有可用空间上的文件。主要针对通过rm命令删除文件的inode链接的那些空间上的文件。该工具会对磁盘进行检查,将找到的可用空间通过/dev/urandom 设备上的随机数据进行填充。

执行命令:

#sfill –v osetc

命令输出如下:

root@devops:~# sfill -v osetc/
Using /dev/urandom for random input.
Wipe mode is secure (38 special passes)
Wiping now ...
Creating osetc/oooooooo.ooo ...

Sdmem 删除内存数据工具

最后我们要介绍一种可以安全的删除RAM 内存储器中的数据的工具名叫sdmem

执行命令如下:

#sdmem –f –v

命令输出如下:

root@devops:~/osetc# sdmem -f -v
Starting Wiping the memory, press Control-C to abort earlier. Help: "sdmem -h"
Wipe mode is secure (38 special passes)

99%的人还阅读了:

Linux 自动删除N小时或分钟前的文件

在前一篇文章我们介绍了如何在Linux系统下自动删除N天前的日志文件,那么本文将会讲述如何在Linux系统下自动删除N小时之前的特定文件或者日志文件。

在日常工作中,经常会有定时清空相关程序目录下特定时间前生成的日志文件的需求。当然实现的具体方法和上篇文章类似,但唯一不同的是find命令查找文件的依据的条件或者参数不同,-mtime是要查找n*24之前或者之内的相关文件,该参数无法实现小于24小时的特定时间的文件查找,当然find命令提供了另一个类似的参数-mmin, 该参数可以让find命令按指定的分钟来查找文件。

Linux下自动删除2小时之前的日志文件

将上篇文章的find 命令更新如下:

find /var/log/ -mmin +120 -name message* -exec rm -rf {} \;

执行完上面的命令后,在/var/log/目录下所有的120分钟或者说2小时以前生成的或者更改过的以message开头的日志文件都会被删掉。

如果要删除两小时之内的日志文件,使用下面的命令:

find /var/log/ -mmin -120 -name message* -exec rm -rf {} \;

将上面的find命令加到Linux系统的任务计划crontab里,即可实现自动定时删除文件。


99%的人还阅读了:

Linux 自动删除日志文件(N天或特定日期)

本文将会讲述如何在Linux系统下自动删除特定日期或者N天系统生成的日志文件或者归档文件或者特定某类文件。

Linux系统和windows系统一样,在系统的运行过程中,会不断的产生日志文件或者日志归档文件,或者其它不同类型的日志文件。随着日志的不断输出到文件里,文件的大小也会越来越大,这样该日志文件就会占据越来多的磁盘空间,而且有可能会将可用存储空间全部占用,这样就有可能导致你的机器越来越慢,相应的服务也会停止。为了防止日志文件变大后,导致的系统不能正常访问,我们需要定期的清理或者删除这些日志文件。

查看Linux系统日志文件

对于Linux 下APACHE服务器里,系统会产生访问时的日志文件,错误访问日志文件,MySQL数据库服务也会产生相应的日志文件, 大多数Linux系统的默认系统日志文件都会放在/var/log/目录下,通过下执行下面的命令来查看Linux系统的日志文件:

#ls /var/log/*

命令输出如下:

root@devops:~# ls /var/log/*
alternatives.log bootstrap.log gpu-manager.log syslog.2.gz
alternatives.log.1 btmp installer syslog.3.gz
......

Linux系统下自动删除日志文件的方

首先我们要查找到你要删除的N天生成日志文件,之后再通过Linux rm命令删除日志文件。 之前我们已经介绍过Linux如何根据文件日期删除文件的方法,所以我们现在只需要在该方法的基础上,实现如何自动删除就可以了。我们可通过Linux下的定时任务命令crontab来实现特定日期日志文件的自动删除。

实例:Linux 下自动删除5天前更改或生成的系统日志文件,参照下面的几个步骤,

1# 确定删除特定日期的日志文件的命令,可以使用下面的命令

find /var/log/ -mtime +5 -name message* -exec rm -rf {} \;

该命令解释如下:

find 是Linux下的查找文件命令
/var/log/ 是指定要查找的文件路径
-mtime 是find 命令下参数,用来指定find命令要根据文件的更改日期来进行查找
+5 是指查找五天前生成或更改过的所有文件(如果是-5, 是指查找五天内生成或更改过的文件)
-name 是指定要查找的文件的模式匹配
-exec 是指当find查找到文件后,要执行的动作。比如删除操作
rm -rf 是指要删除查找到的文件

2# 创建shell脚本文件,将上面的命令加入到脚本里,方便以后调用

执行下面命令:

#vi autoDeleteLog.sh

输入下面的脚本内容:

#!/bin/bash
find /var/log/ -mtime +5 -name message* -exec rm -rf {} \;

保存退出。

3# 为脚本文件增加可执行权

执行下面命令:

#chmod u+x autoDeleteLog.sh

4# 定制计划任务,自动执行autoDeleteLog.sh 脚本

执行命令:

#crontab -e

输入下面的内容:

00 02 * * * /root/autoDeleteLog.sh >/dev/null 2>&1

这样在每天的凌晨2点钟的时候,系统会自动执行日志删除脚本对过期的日志文件进行删除操作。

4# 查看定制的计划任

执行命令如下:

#crontab -l

如果要自动删除特定目录下特定日期的归档文件,只需要将第二步中删除日志文件的命令换成下面的命令:

find /var/log/ -mtime +5 -name *.tgz -exec rm -rf {} \;

如果需要自动删除特定日期的Nginx服务器的日志文件,可以执行下面的脚本,并按照上面的方法,将其通过crontab命令加到系统的计划任务里即可。

#!/bin/bash
find /usr/local/nginx/logs -mtime +5 -type f -name *.log | xargs rm -f

Linux 删除文件名为乱码的文件

本文将会讲述如何通过Linux rm命令删除文件名包含特殊字符或者乱码文件的方法。

在Linux系统下我们主要用来删除文件的命令是rm或者unlink命令,但是当文件名为乱码或者包含乱码的文件是,我们就无法选择要删除的文件名,这样就会导致无法删除这些文件名为乱码或者包含特殊字符的文件。

当然这种乱码文件名的文件大多数情况都是由于不正常的操作,比如突然中断从服务器文件上传或者下载某些文件的时候,就有可能导致乱码文件名的出现。

Linux下删除以短横杠或者减号“-””开头的文件名的文件

当文件名以减号“-”开头的时候,如果我们使用rm 命令来删除该文件的时候,系统会报错,那么删除这种文件,可以通过rm命令后面接–, 来删除。

执行命令如下:

#rm -- -fio.txt

Linux下删除文件名包含特殊字符的文件

如果文件名包含的是系统里可以打印的特殊字符的文件,这个时候我们可以使用转义字符或者双引号来传给rm命令。

如果要删除当前目录下的名为“!”的文件,那么可以执行下面的命令:

# rm  \!

或者

# rm “!“

命令输出日下:

root@devops:~# ls !
!

root@devops:~# ls -al !
-rw-r--r-- 1 root root 0 3月  20 22:20 !

root@devops:~# rm \!

root@devops:~# ls !
ls: 无法访问'!': 没有那个文件或目录

root@devops:~# rm "!"
root@devops:~#

Linux 中删除文件名为乱码的文件

对于文件名包含乱码的文件,这些乱码字符大多数都是系统里无法打印出来的,所以你也无法选择或者从键盘输入,这个时候我们可以通过文件的inode号,再结合find命令,将文件删除。

首先我们通过执行ll -i 命令来获取当前目录下的文件的inode号,比如inode号为131104,然后执行下面的find命令,将该inode所对应的文件删除。执行命令如下:

# find ./ -inum 131104 -print -exec rm {} \;

命令输出如下:

root@devops:~/osetc# ll -i
总用量 32

131103 drwxr-xr-x 2 root root  4096 3月  20 22:28 ./
131073 drwx------ 7 root root  4096 3月  20 22:22 ../
131104 -rw-r--r-- 1 root root     0 3月  20 22:28 $%^%$^
131089 -rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt

root@devops:~/osetc# find ./ -inum 131104 -print -exec rm {} \;
./$%^%$^

root@devops:~/osetc# ll -i
总用量 32
131103 drwxr-xr-x 2 root root  4096 3月  20 22:30 ./
131073 drwx------ 7 root root  4096 3月  20 22:22 ../
131089 -rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt

或者使用另一个命令,如下:

#find -inum 131104 -delete

命令输出如下:

root@devops:~/osetc# find -inum 131104 -delete

root@devops:~/osetc# ll -i
总用量 32
13113 drwxr-xr-x 2 root root  4096 3月  20 22:32 ./
131073 drwx------ 7 root root  4096 3月  20 22:22 ../
131089 -rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt

从上面我们可以看到,inode号为131104的文件被删除了。


Linux 下回收站实现(恢复删除文件)

本文主要讲述通过shell 脚本来实现Linux系统下的类似于windows系统中的回收站的功能。 默认情况下,大多数的Linux发型版本都没有实现回收站的功能,这样就会导致当你错误的删除了系统里某个文件或者错误的执行rm –rf * 命令将某些文件删除后, 我们没有很好的办法恢复已经被误删掉的文件。

下面我们通过简单的shell 脚本函数来重新定义一个trash函数,该函数将会实现当我们执行rm命令删除文件的时候,只是将文件先移动到某个临时的目录文件里,这样就可以起到一个简单回收站功能,如果需要撤销文件删除操作,我们也可以通过重新定义的另一个函数undo,来恢复被删掉的文件,该函数会将你指定的文件从临时目录里恢复到当前目录。

下面是我们实现的shell 函数:

undo( ) # 该函数用来撤销或者恢复被删掉的文件
{
    mv –i ~/.tmp/$@ ./
}

trash( ) # 该函数用来删除指定文件,并将其移动到临时目录~/.tmp/目录里
{
    mv $@  ~/.tmp/
}

cleartrash()  # 该函数用来删除回收站(临时目录)里的所有文件
{
    read -p "要删除回收站里的所有文件吗?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf ~/.Trash/*
}

具体的执行步骤如下

1# 创建临时目录文件或者回收站文件

该目录用来临时存放被删除的文件,执行命令:

#mkdir –p  ~/.tmp

2# 将下面的脚本添加到bash shell 的环境变量设置文件.bashrc 里, 保存退出

alias rm=trash
alias ud=undo
alias tl='ls  ~/.tmp'

undo() # 该函数用来撤销或者恢复被删掉的文件
{
    mv -i ~/.tmp/$@ ./
}

trash() # 该函数用来删除指定文件,并将其移动到临时目录~/.tmp/目录里
{
    mv $@  ~/.tmp/
}

cleartrash()  # 该函数用来删除回收站(临时目录)里的所有文件
{
    read -p "要删除回收站里的所有文件吗?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf ~/.Trash/*
}

3# 执行 .bashrc 脚本

# source ./bashrc

现在我们可以放心的使用rm命令来删除文件了,如果需要恢复被删掉的某个文件,可以使用ud 命令进行撤销删除操作,如果需要列出回收站里的文件,那么可以使用tl 命令。当回收站里的文件确实需要删除了,可以使用cleartrash命令进行清空操作。

下面来看实例操作:

$ rm fio1.txt  fio2.txt     # 删除当前目录下的fio1.txt 和fio2.txt 文件

$ tl                                # 查看回收站里文件

$ ud fio1.txt       #从回收站里恢复之前删掉的fio1.txt 文件

$ cleartrash     # 清空回收站

 

命令输出如下:

root@devops:~/osetc# rm fio1.txt fio2.txt

root@devops:~/osetc# ls

root@devops:~/osetc# tl
fio1.txt  fio2.txt

root@devops:~/osetc# ud fio1.txt

root@devops:~/osetc# tl
fio2.txt

root@devops:~/osetc# ls
fio1.txt

root@devops:~/osetc# cleartrash
要删除回收站里的所有文件吗?[n]y
root@devops:~/osetc#

99%的人还阅读了:

5 种Linux下 删除除指定文件外的所有文件的方法

本文将会讲述Linux系统下通过rm命令删除除指定文件外的其它所有的文件的5中不同的方法。 当我们在当前目录下或者指定目录下,想删除同类文件或者符合同一模式匹配规则的文件,但需要排除其中的某个或多个文件,只是简单的使用rm命令是无法实现。所以我们需要结合其它的linux命令来实现我们的删除文件操作。

下面我们通过5中不同的方法来介绍删除指定文件外的文件的方法:

方法一: 可以先将需要排除的文件,从当前目录中移动到一个临时目录里,然后执行rm命令将其与的文件删除,最后再将刚才移动走的文件从新拷贝回来。

执行的命令如下:

#mv  保留文件 /tmp
# rm –rf  删除文件
#mv  /tmp/保留文件 .

方法二:使用Linux中的通配符来排除保留文件

我们可以使用Linux系统中的通配符 !来排除指定的文件,

比如我们要删除当前目录下除了fio1.txt文件的所有其它文件, 执行下面的命令:

#rm –i  !(fio1.txt)

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt

root@devops:~/osetc# rm -i !(fio1.txt)
rm:是否删除普通文件 'fio2.txt'? y

root@devops:~/osetc# ls
fio1.txt

如果要删除当前目录下,除fio2.txt 和fio3.txt两个文件外的所有文件,可以执行下面的命令:

#rm -i   !(fio2.txt|fio3.txt)

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt

root@devops:~/osetc# rm -i !(fio2.txt|fio3.txt)
rm:是否删除普通文件 'fio1.txt'? y

root@devops:~/osetc# ls
fio2.txt  fio3.txt

方法三:  通过结合grep和xargs命令来删除指定文件外的所有文件

在linux里grep命令里有一个-v 的参数, 该参数可以排除通过grep命令输出的特定的文件,这样grep命令输出的其它文件就是需要删除的。 然后将输出结果过通过管道符传给xargs命令,将其删除。比如要删除除fio1.txt 文件的所有其它文件,执行下面命令:

#ls | grep –v fio1.txt | xargs rm

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt

root@devops:~/osetc# ls | grep -v fio1.txt | xargs rm
root@devops:~/osetc# ls
fio1.txt

方法四:改进方法三, 用find命令来替换ls命令,查找要删除的文件然后通过grep –v在过滤掉需要排除的文件

执行命令如下:

#find ./ | grep –v fio1.txt | xargs rm

方法五:通过fing命令结合xargs 或者其exec参数删除除指定文件外的文件

我们可以通过执行下面的两个find命令组合来删除除指定文件外的所有其它文件,比如要删除除fio1.txt外的所有其它文件,执行命令如下:

# find ./ ! -name fio1.* -exec rm -rf {} \;

或者

#find ./ ! –name fio1.*  | xargs rm –rf

99%的人还阅读了:

Linux unlink命令

本文将会讲述Linux系统下unlink删除文件命令的用法。 Unlink 命令会直接调用linux系统下的unlink系统函数,来删除指定的某一个文件。

Linux unlink 命令格式及参数

命令格式如下:

Unlink {文件名}
Unlink {选项}

Unlink 参数如下:

--help – 显示该命令的帮助信息并退出命令
--version –显示命令的版本信息并退出命令

Unlink命令只有提供了上面的两个参数。

Linux unlink命令实例

1# 删除当前目录下的名为fio.txt 的文件,执行下面的命令:

# unlink fio.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio.txt

root@devops:~/osetc# unlink fio.txt
root@devops:~/osetc# ls
fio1.txt  fio2.txt

上面我提到过,unlink 命令只能同时删除一个文件,当你指定多个文件时,系统会提示错误信息。 如下:

root@devops:~/osetc# unlink fio1.txt fio2.txt
unlink: 额外的操作数 "fio2.txt"
Try 'unlink --help' for more information.
root@devops:~/osetc#

Linux unlink系统函数

Unlink函数会从文件系统中删除一个指定的文件名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。

Unlink函数用法:

#include
int unlink(const char *pathname);

Unlink函数参数:

pathname:指向需解除连接的文件名。

返回说明:

成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EACCES:权能不足
EFAULT: 内存空间不可访问
EIO:发生输入输出错误
EISDIR:pathname索引的是目录
ELOOP :路径解析的过程中存在太多的符号连接
ENAMETOOLONG:路径名超出可允许的长度
ENOENT:路径名部分内容表示的目录不存在,或者是悬浮的连接
ENOMEM: 核心内存不足
ENOTDIR:路径名的部分内容不是目录
EPERM : 文件系统不支持文件或者目录的解除连接,也有可能是权限步允许
EROFS :文件系统只读

当文件的连接数为0的时候,并且没有任何进程打开这个文件,这个文件的存储数据才会被真正的删除。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
    int fd;
    char buf[32];
    struct stat buff;
    if((fd=open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU))<0){
        printf("create file error!\n");
    }
    stat("temp.txt",&buff);
    printf("temp.link=%d\n",buff.st_nlink);
    link("temp.txt","test.txt");
    stat("test.txt",&buff);
    printf("after link the tem.link =%d\n",buff.st_nlink);
    if(unlink("temp.txt")<0){
        printf("unlink error !\n");
    }
    stat("temp.txt",&buff);
    printf("after unlink tem.link=%d\n",buff.st_nlink);
    if(write(fd,"temp",5)<0){
        printf("write wrror!\n");
    }
    if((lseek(fd,0,SEEK_SET))==-1){
       printf("lseek error!\n");
    }
    if((read(fd,buf,5))<0){
        printf("read error!\n");
    }
    printf("%s\n",buf);
    return 0;
}

99%的人还阅读了:

Linux rm 删除命令

当我们在Linux系统下,如果要删除某个特定的文件或者特定目录下的特定文件,那么首先会想到的是Linux系统的系统命令rm。 本文将会对rm删除文件命令的使用方法做详细的介绍,包括rm命令的命令格式,包含的命令选项,并且通过实例来介绍rm命令的不同选项。

Linux rm 命令介绍

rm 命令在英语里就是remove单词的缩写,就是删除的意思, 该命令主要用来删除linux文件系统下的文件。当使用rm命令的递归参数-rf的话,也可用来删除目录文件。

我们可以在命令行下通过rm命令来删除指定的每一个文件。 默认情况下,该命令不会删除目录文件。

Linux rm命令删除文件的处理过程只是删除文件所对应的inode链接,但并不会删除或者清空文件的存储数据,当删除完成后,系统会将该文件的存储空间标记为空闲状态,这样就别的程序就可以将数据写入这个空间里了。 也就是说,当你删除一个文件的时候,文件数据并没有被改变,只是不会再关联到这个文件名了。

因为文件数据本身并没有被销货,所以当rm命令将指向数据区域的指针删除掉后, 该数据就不能再被访问了, 而且也没法注销该删除操作。不像我们在windows系统里, 我们可以去回收站里将删除的文件恢复到以前的存储位置。

注意: 如果你想彻底的将文件数据从磁盘里删掉,我们可以通过使用Linux系统的shred命令将指定文件所在存储数据测试重新覆盖,这样数据就彻底无法再恢复了。

Linux rm 命令格式及参数

rm [参数] {文件名}

参数如下:

-f, –force 强制删除文件, 不做任何删除操作的提示
-I, –interactive  进行交互式的删除操作
-r, -R, –recursive 将对指定目录中的所有目录或子目录进行递归性的删除
-v, –verbose 显示删除操作的详细信息
–help 显示命令的使用帮助信息
-d, 删除空目录文件,rm –d 和rmdir命令的效果是一样的。

对于-I选项,当rm 命令在删除文件的时候,如果指定的文件超过3个话,rm 命令在删除文件前,会做出删除提示。

Linux rm命令删除目录文件

默认情况下,rm命令不会删除目录文件的。 但是如果使用了-r/-R/–recursive 选项的话, rm命令将会删除所有匹配到的文件或者目录。

如果指定的目录是个空目录,那么可以使用rm命令的-d/–dir 参数来删除。

如果需要删除当前目录下的空目录文件fio1,执行下面的命令:

#rm –d  fio1

命令输出如下:

root@devops:~/osetc# rm fio1/
rm: 无法删除'fio1/': 是一个目录

root@devops:~/osetc# rm -d fio1/
root@devops:~/osetc#

如果要删除目录下的所有普通文件或者子目录文件,并不做删除确认提示,可以使用rm命令的-rf选项做递归删除,执行下面命令:

#rm –rf  fio

Linux rm命令删除普通文件

如果要删除当前目录下的普通文件 fio.txt, 当要删除的文件是写保护的,系统会做出删除确认提示,执行下面的命令:

#rm fio.txt

命令输出如下

root@devops:~/osetc# ll
总用量 16
drwxr-xr-x 2 root root 4096 3月  17 22:01 ./
drwx------ 6 root root 4096 3月  15 21:48 ../
-rw-r--r-- 1 root root    5 3月  15 21:24 fio5.txt
-r--r--r-- 1 root root    5 3月  17 22:01 fio.txt

root@devops:~/osetc# rm fio.txt
root@devops:~/osetc#

Linux rm 命令强制删除文件

如果想在删除文件的时候,不想有任何确认提示,那么可以使用rm命令的-f选项,执行下面的命令:

#rm –f fio.txt

命令输出如下:

root@devops:~/osetc# ls
fio5.txt  fio.txt

root@devops:~/osetc# rm -f fio.txt

root@devops:~/osetc# ls
fio5.txt

root@devops:~/osetc#

Linux rm 命令结合通配符删除所有.txt 文件

如果想删除目录下所有的文件名以.txt 结尾的文件,那么可以使用Linux下通配符来匹配要删除的文件,然后结合rm命令进行删除。执行下面的命令:

# rm *.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt

root@devops:~/osetc# rm *.txt

root@devops:~/osetc# ls
root@devops:~/osetc#

Linux rm 命令交互式删除文件

如果想在删除文件的时候,让系统做出删除文件的确认提示,这样可以做交互式的确认,当输入Y的时候,就进行文件删除,当输入N的时候,文件不会被删除。 可以使用linux rm 命令的-i选项,执行命令如下:

# rm –i fio5. Txt

命令输出如下:

root@devops:~/osetc# ls
fio5.txt

root@devops:~/osetc# rm -i fio5.txt
rm:是否删除普通文件 'fio5.txt'? y

root@devops:~/osetc# ls
root@devops:~/osetc#

Linux rm 命令删除文件时并排除特定的某个文件或某类文件

当我们在删除某类文件的时候,想排除特定的文件,此时如果简单的执行rm命令是无法完成的。 我们需要通过结合其它的Linux命令,比如grep命令来实现。 比如我们先删除目录下的除了fio.txt文件的所有.txt文件,那么可以执行下面的命令:

# rm `ls *.txt|grep –v fio.txt`

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt

root@devops:~/osetc# rm -i `ls *.txt| grep -v fio1.txt`
rm:是否删除普通文件 'fio2.txt'? y
rm:是否删除普通文件 'fio3.txt'? y

root@devops:~/osetc# ls
fio1.txt

Linux rm命令和unlink命令的不同之处

Linux里rm 命令 和unlink 命令主要功能都是用来删除指定的文件。 但是unlink命令只能同时删除一个文件,而且不能删除目录文件,并且该命令没有任何的附加选项。只是用来通过调用unlink函数来删除指定的一个文件。而在大多数版本的linux系统中的rm命令包含了我们上面介绍的参数,并可以做交互式操作,安全检查,条件删除以及递归操作等。

root@devops:~/osetc# unlink fio1.txt fio2.txt
unlink: 额外的操作数 "fio2.txt"
Try 'unlink --help' for more information.

99%的人还阅读了: