`

在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?

阅读更多

问:在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?

 

答:脚本del_files_of_date.sh

用法:./del_files_of_date.sh <YYYY-mm-dd> <files...>

比如:./del_files_of_date.sh 2011-09-01 html/*.html

#!/bin/sh

: ${2?"usage: $0 <YYYY-mm-dd> <files...>"}

for f in "${@:2}"
do
        modify_time=$(stat --printf '%y' "$f")
        if [[ $modify_time == $1* ]]; then
                echo "$f" "$modify_time"
                rm -v -- "$f"
        fi
done

 

下面是此脚本的一次执行示例

[root@jfht contents]# ./del_files_of_date.sh 2011-08-01 html/*.html
html/0041bb66458751c989fe55d8dd837458.html 2011-08-01 08:55:58.000000000 +0800
已删除“html/0041bb66458751c989fe55d8dd837458.html”
html/05602e464e720e482fe0a33ac71198ea.html 2011-08-01 12:55:33.000000000 +0800
已删除“html/05602e464e720e482fe0a33ac71198ea.html”
……
……
html/ff4dd248f7f6b97bc07519d561d47111.html 2011-08-01 18:55:37.000000000 +0800
已删除“html/ff4dd248f7f6b97bc07519d561d47111.html”
[root@jfht contents]#

 

下面详细解释此脚本

 

第3行:: ${2?"usage: $0 <YYYY-mm-dd> <files...>"}

 

内建命令:(冒号),用来做参数扩展。如果没有,那么就会把后面${2...}的结果当做命令来执行。

man : 写道
: [arguments]
     No effect; the command does nothing beyond expanding arguments and performing any specified redirec-
tions. A zero exit code is returned.

 

[root@jfht contents]# touch 1.txt
[root@jfht contents]# ./del_files_of_date.sh 2011-09-01 1.txt
./del_files_of_date.sh: line 3: 1.txt: command not found

上面这行是没有在前面增加:命令的执行效果。
1.txt 2011-09-01 19:56:46.000000000 +0800
[root@jfht contents]#

 

(关于:命令的更多信息,参见“我使用过的Linux命令之:(冒号) - 啥也不做(除了……) ”)

 

第3行:: ${2?"usage: $0 <YYYY-mm-dd> <files...>"}

 

${VAR?STRING}的作用是判断变量VAR是否为空,如果为空则打印STRING指定的信息后退出。

这很适合用来检查是否提供了足够多的命令行参数或者变量是否设置,如果为否,打印使用帮助退出。

其中,?前的2,表示是第二个命令行参数。即第二个命令行参数没有设置,就打印帮助信息退出。

 

[root@jfht contents]# ./del_files_of_date.sh
./del_files_of_date.sh: line 3: 2: usage: ./del_files_of_date.sh <YYYY-mm-dd> <files...>
[root@jfht contents]# ./del_files_of_date.sh 2011-09-01
./del_files_of_date.sh: line 3: 2: usage: ./del_files_of_date.sh <YYYY-mm-dd> <files...>
[root@jfht contents]#

 

第5行:for f in ${@:2}

 

在Bash中for结构的写法

for VAR in LIST

do

    DO_SOMETHING_OF_VAR

done

 

(关于 for 语句的更多信息,参见“我使用过的Linux命令之for - Bash中的For循环 ”)

 

第5行:for f in "${@:2}"

 

关于 ${@:2},其中 @ 是代表所有命令行参数,2表示从第二个参数开始的所有参数。

更通用的情况:${@:START:N},表示从第START个参数开始,截取N个参数。

 

要注意的是${@:2}必须写在双引号里面。

如果去掉双引号,将不能正确处理带有空格的文件名,如下所示:

 

[root@jfht contents]# ./del_files_of_date.sh 2011-09-03 'hello world.txt'
stat: 无法 stat “hello”: 没有那个文件或目录
stat: 无法 stat “world.txt”: 没有那个文件或目录

以空格分隔成文件名,显然不是期望的结果。
[root@jfht contents]#

 

加上双引号的处理情况:

[root@jfht contents]# ./del_files_of_date.sh 2011-09-03 'hello world.txt'
stat: 无法 stat “hello world.txt”: 没有那个文件或目录
[root@jfht contents]#

 

第7行:modify_time=$(stat --printf '%y' "$f")


关于 $(),把其中的内容当做命令行执行,把标准输出保存到字符串中。

也可以用一对反引号来实现,写作 modify_time=`stat --printf '%y' "$f"`

 

第7行:modify_time=$(stat --printf '%y' "$f")

 

$(stat --printf '%y' "$f") 用来输出指定文件$f的修改时间(如 2011-09-01 10:26:04.000000000 +0800)。

stat用来打印文件的相关信息的,比如大小、修改时间、访问时间等。

开始时我采用的参数是--format,后面改用--printf更好些。

 

man stat 写道
-c --format=FORMAT
    use the specified FORMAT instead of the default; output a newline after each use of FORMAT

--printf=FORMAT
    like --format, but interpret backslash escapes, and do not output a mandatory trailing newline. If you
want a newline, include \n in FORMAT.

The valid format sequences for files
       %y     Time of last modification

 

(关于 stat 命令的更多信息,参见“我使用过的Linux命令之stat - 显示文件或文件系统状态 ”)

 

第8行:if [[ $modify_time == $1* ]]; then

 

在Bash中 if 结构的写法 如下

if CONDITION; then

   DO_SOMETHING

fi

 

如果 DO_SOMETHING 部分的语句很少,也可写作

if CONDITION; then DO_SOMETHING; fi

但别忘了在 fi之前加上分号,否则 Bash解析的时候不知道命令是否结束了。

 

(关于 if 语句的更多信息,参见“我使用过的Linux命令之if - Bash中的条件判断语句 ”)

 

第8行:if [[ $modify_time == $1* ]]; then

 

关于 [[ ]],在Bash中 [[ 是个内建命令。 与 [ ] 不同的是,可以不用双引号把变量引用起来,而且支持通配符模式的匹配。

[[ $modify_time == $1* ]]  表示modify_time是以第1个命令行参数开头。

 

help [[ 写道
[[ ... ]]: [[ expression ]]
Returns a status of 0 or 1 depending on the evaluation of the conditional
expression EXPRESSION. Expressions are composed of the same primaries used
by the `test' builtin, and may be combined using the following operators

( EXPRESSION ) Returns the value of EXPRESSION
! EXPRESSION True if EXPRESSION is false; else false
EXPR1 && EXPR2 True if both EXPR1 and EXPR2 are true; else false
EXPR1 || EXPR2 True if either EXPR1 or EXPR2 is true; else false

When the `==' and `!=' operators are used, the string to the right of the
operator is used as a pattern and pattern matching is performed. The
&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
determine the expression's value.
 

第10行:rm -v -- "$f"


rm命令用于删除文件。增加 -v 参数,可以打印删除的文件信息。增加 -- 参数,是为了正确的处理 $f 以 - 开头的情况。

man rm 写道
-v, --verbose
     explain what is being done

To remove a file whose name starts with a ‘-’, for example ‘-foo’, use one of these commands:
              rm -- -foo
              rm ./-foo
 

(关于 rm 命令的更多信息,参见:“我使用过的Linux命令之rm - 删除文件或目录 ”)

 

 

本文链接:http://codingstandards.iteye.com/blog/1163913   (转载请注明出处)

 

PS: 第5到12行完全可以精简为一行。

脚本 del_files_at_date.sh

#!/bin/sh

: ${2?"usage: $0 <YYYY-mm-dd> <files...>"}

for f in "${@:2}"; do [[ $(stat --printf '%y' "$f") == $1* ]] && rm -v -- "$f"; done

 

[root@jfht contents]# ./del_files_at_date.sh
./del_files_at_date.sh: line 3: 2: usage: ./del_files_at_date.sh <YYYY-mm-dd> <files...>
[root@jfht contents]# touch test1.txt 'test space.txt'
[root@jfht contents]# ./del_files_at_date.sh 2011-09-02 test*.txt
已删除“test1.txt”
已删除“test space.txt”
[root@jfht contents]#

 

 

5
2
分享到:
评论

相关推荐

    修改文件的修改日期 (2).zip

    在Windows操作系统中,文件的属性包括创建日期、修改日期和访问日期,而修改日期是指文件内容最后一次被改动的时间戳。有时,出于各种原因,例如同步问题、测试或数据整理,我们可能需要调整这些时间戳。 首先,让...

    Linux命令文件.docx

    2. 选择内核版本并进入“一次性命令行”模式。 3. 加载必要的模块和服务。 4. 使用`mount`命令挂载根文件系统。 5. 使用`chroot /`进入根文件系统。 6. 使用`passwd root`重置root密码。 #### 文件与目录操作 - **...

    Linux系统基本命令

    - 作用:一次显示一页内容,适合查看大文件。 - 实战场景:查看大文件内容,逐页滚动阅读。 - **cp**:复制文件或目录。 - 示例命令:`cp source_file destination_file` - 作用:将source_file复制到...

    linux常用命令大全.pdf

    - **cat**: 一次性显示文件内容。此外,还可以用来合并多个文件为一个文件,或者向已存在的文件追加内容。 - **more/less**: 以分页形式查看文件内容。`less`提供比`more`更丰富的功能,如上下翻页、搜索等。 - *...

    Linux操作系统基础教程

    讲座的目的就是在同学们中间普及 Linux 基础知识,为今后我们更加接近的了解 Linux 做一 个好的开端。 第一讲 Linux基础 在这一讲中,我们主要是了解一下 Linux 的概况,以及对 Linux 有一个初步的感性认识。 ...

    cmd操作命令和linux命令大全收集

    例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件 del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同时使用参数/Q ...

    Linux常用命令速查手册.pdf

    :在根目录下搜索名为 *.rpm 的文件,并将其权限修改为 755。 7. find / -xdev -name *.rpm:在根目录下搜索名为 *.rpm 的文件,但忽略其他文件系统。 四、其他命令 1. shutdown -h now:立即关闭系统。 2. init 0...

    Linux下的用户管理

    ### Linux下的用户管理 在Linux系统中,用户管理是一项重要的任务,它涉及到用户账户的创建、修改、删除以及权限的分配等操作。本文将详细解释Linux环境下与用户管理相关的操作命令,帮助读者更好地理解并掌握这些...

    linux常用命令集(PDF版)

    30. at - 一次性执行命令的作业调度器。 31. /etc/aliases - 邮件别名配置文件。 32. mail - 发送和接收邮件的命令行工具。 33. mesg - 控制是否允许其他用户向终端发送消息。 34. talk - 用于与其他用户进行交谈。 ...

    linux常见操作命令

    * rm:可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉 * rm 文件:删除文件 * rm -r 目录或文件:删除目录(及目录下所有文件) * rm -rf 目录或文件:强制删除

    Linux常用的60个命令

    54. `at`和`cron`:分别用于一次性和定期执行命令。 55. `diff`:比较两个文件或目录的差异。 56. `sort`:对文本文件的行进行排序。 57. `uniq`:删除重复的行。 58. `wc`:统计文件中的行数、字数、字节数。 ...

    Linux命令行.pdf

    - 一次性创建多个目录,并显示具体创建信息:`mkdir -vp temp/test` - 创建权限为 777 的目录:`mkdir -m 777 temp` - **touch** - **功能**: 更新文件的时间戳或创建新文件。 - **格式**: `touch [选项] [文件]...

    linux常用命令(自己总结的)

    - 若文件内容较多,会一次性输出所有内容,可能导致阅读不便。 **less 显示文件的所有内容,分屏** - **功能**: 分页显示文件内容,便于查看长文件。 - **基本语法**: `less 文件名` - 使用 `less` 命令时,可以...

    Linux期末考试题

    1. `at`命令用于一次性安排任务,而`cron`服务(通过`crontab`命令配置)用于定期重复执行任务。 2. 这是挂载软盘到/mnt/floppy的命令,`mount -t vfat /dev/fd0 /mnt/floppy`,这里 `-t vfat` 指定了文件系统类型...

    linux定时器任务详解

    - 对于需要更精确时间控制的任务,可考虑使用at命令(一次性任务)。 - 确保定时执行的脚本或命令具有可执行权限,否则定时任务可能失败。 通过以上详细的讲解,可以看出Linux定时器任务的强大功能以及灵活的使用...

    Linux菜鸟入门级命令大全.doc

    `cat`一次性显示整个文件,而`more`分页显示。`cat&gt;1.c`可以新建并编辑`1.c`文件,按`Ctrl+D`保存,`gcc -o 1 1.c`编译源代码文件。 8. **chmod**:修改文件或目录的权限。例如,`chmod u+x filename`仅允许文件...

Global site tag (gtag.js) - Google Analytics