exec命令

find命令基础

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。 

exec解释:

-exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

{}   花括号代表前面find查找出来的文件名。

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名

实例1:ls -l命令放在find命令的-exec选项中 

命令:

find . -type f -exec ls -l {} \;

输出:

[root@localhost test]# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log
-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log
-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log
-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log
-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log
[root@localhost test]#

说明: 

上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。

实例2:在目录中查找更改时间在n日以前的文件并删除它们

命令:

find . -type f -mtime +14 -exec rm {} \; 

输出:

[root@localhost test]# ll
总计 328
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root     33 10-28 16:54 log2013.log
-rw-r--r-- 1 root root    127 10-28 16:51 log2014.log
lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log
-rw-r--r-- 1 root root     25 10-28 17:02 log.log
-rw-r--r-- 1 root root     37 10-28 17:07 log.txt
drwxr-xr-x 6 root root   4096 10-27 01:58 scf
drwxrwxrwx 2 root root   4096 10-28 14:47 test3
drwxrwxrwx 2 root root   4096 10-28 14:47 test4
[root@localhost test]# find . -type f -mtime +14 -exec rm {} \;
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log
drwxr-xr-x 6 root root   4096 10-27 01:58 scf
drwxrwxrwx 2 root root   4096 11-12 19:32 test3
drwxrwxrwx 2 root root   4096 11-12 19:32 test4
[root@localhost test]# 

说明

在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。 

实例3:在目录中查找更改时间在n日以前的文件并删除它们在删除之前先给出提示

命令:

find . -name "*.log" -mtime +5 -ok rm {} \;

输出:

[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log
drwxr-xr-x 6 root root   4096 10-27 01:58 scf
drwxrwxrwx 2 root root   4096 11-12 19:32 test3
drwxrwxrwx 2 root root   4096 11-12 19:32 test4
[root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;
< rm ... ./log_link.log > ? y
< rm ... ./log2012.log > ? n
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
drwxr-xr-x 6 root root   4096 10-27 01:58 scf
drwxrwxrwx 2 root root   4096 11-12 19:32 test3
drwxrwxrwx 2 root root   4096 11-12 19:32 test4
[root@localhost test]#

说明

面的例子中, find命令在当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除文件,按n键不删除。 

 

实例4:-exec使用grep命令

命令:

find /etc -name "passwd*" -exec grep "root" {} \;

输出:

[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@localhost test]#

说明:

任何形式的命令都可以在-exec选项中使用。  在面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。

实例5:查找文件移动到指定目录  

命令:

find . -name "*.log" -exec mv {} .. \;

输出:

[root@localhost test]# ll
总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:49 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# cd test3/
[root@localhost test3]# ll
总计 304
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log
[root@localhost test3]# find . -name "*.log" -exec mv {} .. \;
[root@localhost test3]# ll
总计 0[root@localhost test3]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root   4096 10-27 01:58 scf
drwxrwxr-x 2 root root   4096 11-12 22:50 test3
drwxrwxr-x 2 root root   4096 11-12 19:32 test4
[root@localhost test]#
实例6:用exec选项执行cp命令  

命令:

find . -name "*.log" -exec cp {} test3 \;

输出:

[root@localhost test3]# ll
总计 0[root@localhost test3]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root   4096 10-27 01:58 scf
drwxrwxr-x 2 root root   4096 11-12 22:50 test3
drwxrwxr-x 2 root root   4096 11-12 19:32 test4
[root@localhost test]# find . -name "*.log" -exec cp {} test3 \;
cp: “./test3/log2014.log” 及 “test3/log2014.log” 为同一文件
cp: “./test3/log2013.log” 及 “test3/log2013.log” 为同一文件
cp: “./test3/log2012.log” 及 “test3/log2012.log” 为同一文件
[root@localhost test]# cd test3
[root@localhost test3]# ll
总计 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log
[root@localhost test3]#

    Linux是一个很能自动产生文件的系统,日志、邮件、备份等。虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情。不用你去每天惦记着是否需要清理日志,不用每天收到硬盘空间不足的报警短信,想好好休息的话,让我们把这个事情交给机器定时去执行吧。

1.删除文件命令:

find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;

实例命令:

find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;
/opt/soft/log/目录下所有30天前带".log"的文件删除。具体参数说明如下:

(一)  find:linux的查找命令,用户查找指定条件的文件;
(二)  /opt/soft/log/:想要进行清理的任意目录;
(三)  -mtime:标准语句写法;
(四)  +30:查找30天前的文件,这里用数字代表天数;
(五)  "*.log":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;
(六)  -exec:固定写法;
(七)  rm -rf:强制删除文件,包括目录;
(八)  {} \; :固定写法,一对大括号+空格+\+; 

2.计划任务:

若嫌每次手动执行语句太麻烦,可以将这小语句写到一个可执行shell脚本文件中,再设置cron调度执行,那就可以让系统自动去清理相关文件。

2.1创建shell

touch /opt/soft/bin/auto-del-30-days-ago-log.sh

chmod +x auto-del-30-days-ago-log.sh

新建一个可执行文件auto-del-30-days-ago-log.sh,并分配可运行权限

2.2编辑shell脚本:

vi auto-del-30-days-ago-log.sh

编辑auto-del-30-days-ago-log.sh文件如下:

#!/bin/sh

find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

ok,保存退出(:wq)。

2.3计划任务:

#crontab -e

将auto-del-30-days-ago-log.sh执行脚本加入到系统计划任务,到点自动执行

输入:

10 0 * * * /opt/soft/log/auto-del-7-days-ago-log.sh >/dev/null 2>&1

这里的设置是每天凌晨0点10分执行auto-del-7-days-ago-log.sh文件进行数据清理任务了。

完成以上三步,你就再也不每天惦记是否硬盘空间满了,该清理日志文件了,再也不会受到服务器硬盘空间不足的报警信息了,放心的去看书喝咖啡去吧!

3.findexec命令

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。 

exec解释

(一)  -exec  参数后面跟的是command命令,它的终止是以 ; 为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

(二)  {}   花括号代表前面find查找出来的文件名。

(三)  使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。

(四)  在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先
用ls命令看一下,确认它们是所要删除的文件。 

(五)  exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命
令,会发现该命令只输出从当前路径起的相对路径及文件名。

实际使用用例:

(一)  实例1:ls -l命令放在find命令的-exec选项中

命令:find. -type f -exec ls –l  {}  \;

(二)  实例2:在目录中查找更改时间在n日以前的文件并删除它们

命令:find . -type f -mtime +14 -exec rm {} \;

(三)  实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示

命令:find. -name "*.log" -mtime +5 -ok rm {} \;

(四)  实例4:-exec中使用grep命令

命令:find /etc -name "passwd*" -exec grep "root" {}\;

(五)  实例5:查找文件移动到指定目录 

命令:find . -name "*.log" -exec mv {} .. \;

(六)  实例6:用exec选项执行cp命令 

命令:find . -name "*.log" -exec cp {} test3  \;   
(七)  借助 -exec选项与其他命令结合使用

找出当前目录下所有root的文件,并把所有权更改为用户tom

find .-type f -user root -exec chown tom {}\;

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。

(八)  找出自己家目录下所有的.txt文件并删除

find$HOME/.-name"*.txt"-okrm{} \;

(九)  上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。

查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中

find.-typef-name"*.txt"-execcat {} \;>all.txt

(十)  将30天前的.log文件移动到old目录中

find.-typef-mtime+30-name"*.log"-execcp{} old \;

(十一)找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来

find . -typef -name "*.txt" -exec printf "File: %s\n" {} \;

(十二)因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
-exec./text.sh {} \;
(十二)查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
         find . -path "./sk"-prune -o -name "*.txt" -print






### exec 在 IT 技术中的用法及解决方案 #### 1. `exec` 的基本概念 在 IT 领域中,`exec` 是一个常见的命令或函数,用于替换当前进程的镜像为新的程序或脚本。它的主要功能是通过加载一个新的可执行文件来替换当前进程的内容,而不会创建新的子进程[^4]。 #### 2. Shell 中的 `exec` 命令 在 Unix 或 Linux 系统的 Shell 脚本中,`exec` 常用于替换当前 Shell 进程为另一个程序。例如: ```bash exec /path/to/new_program ``` 上述代码将当前 Shell 替换为指定的程序 `/path/to/new_program`,并且原 Shell 不会继续运行[^4]。 此外,`exec` 还可以用于重定向文件描述符: ```bash exec 3<> /path/to/file ``` 此命令打开文件并将其绑定到文件描述符 `3`,以便后续读写操作使用[^4]。 #### 3. Dockerfile 中的 `exec` 形式 在 Dockerfile 中,`exec` 形式通常用于定义容器启动时运行的命令。与 Shell 形式相比,`exec` 形式的命令更高效且避免了额外的 Shell 解析层。例如: ```dockerfile CMD ["executable", "param1", "param2"] ``` 上述代码以 `exec` 形式指定容器启动时运行的命令和参数,确保直接调用可执行文件而不经过 Shell[^4]。 #### 4. 编程语言中的 `exec` 函数 在许多编程语言中(如 C、Python、Perl),`exec` 函数用于启动外部程序并替换当前进程。以下是几个示例: - **C 语言中的 `exec` 系列函数**: ```c #include <unistd.h> int main() { char *args[] = {"/bin/ls", "-l", NULL}; execv(args[0], args); // 替换当前进程为 /bin/ls return 0; } ``` 上述代码使用 `execv` 函数将当前进程替换为 `/bin/ls`,并传递参数 `-l`。 - **Python 中的 `os.exec*` 系列函数**: ```python import os args = ["/bin/ls", "-l"] os.execv(args[0], args) # 替换当前 Python 进程为 /bin/ls ``` 此代码片段展示了如何在 Python 中使用 `os.execv` 替换当前进程。 #### 5. 解决方案:常见问题及处理方法 - **问题:为什么 `exec` 后面的代码不执行?** - 因为 `exec` 替换了当前进程,后续代码不会被执行。如果需要保留后续代码逻辑,应改用 `system` 或 `fork`[^4]。 - **问题:如何在 Docker 容器中以非特权模式运行 `exec`?** - 如果容器环境限制了特权模式,可以通过调整安全策略解决。例如,检查 `/etc/docker/daemon.json` 文件以确认是否允许特定行为[^2]。 - **问题:如何调试 `exec` 替换失败的情况?** - 在 C 或其他语言中,可以在 `exec` 调用后添加错误处理代码。例如: ```c if (execv(args[0], args) == -1) { perror("execv failed"); exit(EXIT_FAILURE); } ``` #### 6. 性能优化与注意事项 - 使用 `exec` 替换进程可以减少内存占用,因为它不会创建新的子进程。 - 在编写脚本或程序时,确保目标程序路径正确且具有执行权限。 ```python import os try: os.execv("/path/to/executable", ["arg1", "arg2"]) except Exception as e: print(f"Error: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值