Linux 删除文件的特定行(第一行,前n行,最后一行)

当我们编辑文件的时候时候,我们通过可以vi/vim编辑器删除文件中的特定行,比如删除第一行或者删除最后行或者符合某个模式的行。 但是如何在shell脚本里来删除特定的符合条件的行呢。 这时候,我们可以使用linux下强大的文本处理工具sed。 我们可以通过该命令删除指定的行,或者通过sed命令提供的正则表达式,来查找符合模式匹配的行,然后将其删除。

删除文件的第一行

如果要删除文件的行,并将其立即应用到源文件,在sed命令里需要使用-i 选项,否则,只是将删除文件内容显示出来,但不会真正的删除文件的内容。 执行下面的命令:

# sed -i '1d' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i '1d' fio.txt
root@devops:~/osetc# cat fio.txt
line2  b
line3  c

删除文件的最后一行

通过sed命令删除文件里的最后一行,和上面的删除行的命令类似,都是需要-i选项,并结合d选项进行删除操作,但需要指定要删除行的行号,最后一行可以用$来表示,执行下面命令:

# sed -i '$d' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i '$d' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line2  b

删除文件中指定行

通过上面的两个例子,我们应该知道要删除特定行号的行,只需要将行号跟着d命令的前面即可,比如要删除第3行的内容,可以执行下面的命令:

# sed -i '3d' fio.txt

删除包含特定字符的行

如果你想删除包含特定字符的行,只要通过sed命令的模式匹配部分指定特定字符,然后通过d命令将其删除。
比如要删除包含line2的行,执行下面的命令:

# sed -i '/line2/d' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i '/line2/d' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line3  c

在文件中增加一行内容

我们可以通过sed命令在特定的某行后面增加新行,比如要在包含line1的行后增加一行“line2   b”, 执行下面的命令:

# sed -i '/line1/a line2  b' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line3  c
root@devops:~/osetc# sed -i '/line1/a line2  b' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc#

在文件中替换特定的行

如果想把文件中的包含line3的行中line3 字符串替换成line4, 可以通过sed工具下的s命令来实现,执行下面的命令:

# sed -i 's/line3/line4/g' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i 's/line3/line4/g' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line4  c

从上面的例子我们可以看到sed是一个非常易用好用的linux文本行处理工具。


99%的人还阅读了:

Linux下通过grep命令恢复被删文件的内容

我们之前已经介绍了在linux下通过构建一个类似于windows的回收站来恢复被删除的文件。 今天我们再来介绍一个通过grep命令来恢复被删除文件的内容的方法。 我们都知道,当linux的删除命令rm执行删除文件操作后,文件数据并没有从磁盘存储上移除,所以只要文件内容没有被覆盖掉,文件内容依然有被恢复的可能性。
因为linux下一切数据皆以文件的形式存放,依旧是说磁盘设备也是以文件的形式存在。所以我们可以通过grep命令来过滤查找出我们删除文件的内容,并将其重定向到另一个文件里,这也也就能达到恢复文件的目的。
1# 确定根目录所在的磁盘
执行命令:

#mount | grep sda

命令输出如下:

root@devops:~/osetc# mount | grep sda
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

2# 删除文件
执行rm命令:

#rm fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
delete line 1
delete line 2
delete line 3
delte line 4
delete line 5
root@devops:~/osetc# rm fio.txt

3# 通过grep命令恢复被删除文件fio.txt 的内容到recovery.txt里
执行下面命令:

#grep -a -B 10 -A 10 'delete line 1' /dev/sda1 >recovery.txt

参数介绍
-a 将二进制文件作为普通文件看待
-B, –before-content 过滤出指定模式串之前的特定数目的行
-A, –after-content 过滤出指定模式匹配之后的特定数目的行


99%的人还阅读了:

Linux 快速删除百万级文件(rsync命令)

当我们想在linux下删除文件的时候,我们会想到通过rm命令来进行删除操作。 而当我们要删除的文件很多的时候,我们会遇到“/bin/rm: Argument list too long“的问题,上一篇文章我们已经介绍了通过find命令或者xargs命令或者自定义shell脚本的方法来避免这种错误。但是如果你想删除几十万或者上百万的文件的话,如果使用之前介绍的方法,效率会很低,删除所需要的时间也会很长。本文会介绍一种通过rsync命令来快速删除大批量文件的方法,并与之前的find命令结合rm命令删除文件的方法进行比较。

Find命令结合rm 命令删除文件

假如要删除当前目录下的上百万个文件(下面的例子以删除1000个文件做比较),执行下面的命令,并通过time命令来查看find /rm命令组合删除文件所需要的时间, 执行命令如下:

#time find  ./ -name * --exec rm –rf {} \;

命令输出如下:

root@devops:~/osetc# time find  ./ -name "*.txt" -exec rm  {} \;
real    0m0.543s
user    0m0.475s
sys     0m0.062s

通过rsync 命令快速删除百万级文件

首先要创建一个空的目录文件,执行命令:

#mkdir   /root/tmp

再通过rsync命令删除当前目录下的大批量文件,执行下面的命令:

#time rsync --delete-before -a -H --stats /root/tmp/  ./

命令输出如下:

root@devops:~/osetc# time rsync --delete-before -a -H --stats /root/tmp/  ./
Number of files: 1 (dir: 1)
Number of created files: 0
Number of deleted files: 1,002 (reg: 1,001, dir: 1)
Number of regular files transferred: 0
Total file size: 0 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total byes sent: 47
Total bytes received: 13,942
sent 47 bytes  received 13,942 bytes  27,978.00 bytes/sec
total size is 0  speedup is 0.00
real    0m0.058s
user    0m0.013s
sys     0m0.022s
root@devops:~/osetc#

从上面两个命令输出的执行时间,我们可以看到find命令运行时间是rsync命令删除文件所需要时间的9倍之多。故而,如果以后我们有这种删除百万级别的文件操作的时候,可以考虑使用rsync命令。


99%的人还阅读了:

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%的人还阅读了: