首页 > 其他分享 >如何将 find 命令与 exec 一起使用

如何将 find 命令与 exec 一起使用

时间:2023-04-08 10:22:06浏览次数:46  
标签:文件 exec 命令 type find hbs

Linux 中的 find命令是根据给定条件查找文件和目录的出色工具。

通过实际对找到的文件执行特定操作,您可以将您的发现提升到一个新的水平。

例如,您找到了所有扩展名为 .jpeg 的文件。用 .jpg 扩展名重命名它们怎么样?

您不能只是通过管道将find 命令输出重定向到另一个命令。它不会那么简单。

您有两种方法可以根据 find 命令的结果执行其他命令:

  • 使用 xargs
  • 使用执行

已经有一篇关于 xargs 命令的详细文章。本教程将重点介绍组合 find 和 exec 命令。

将 exec 命令与 find 命令的输出一起使用

用exec执行find的基本语法如下:

find [path] [arguments] -exec [command] {} \;

这是一个快速的解释:

  • [command]是您要对 find 命令给出的结果执行的内容。
  • {}是一个占位符,用于保存 find 命令给出的结果。
  • \; 表示对于每个找到的结果,都会执行[command] 。你需要逃避; 在这里,因此 \;。
⚠️ {}和\之间必须有一个空格;

还有另一种语法与上述略有不同,如下所示:

find [path] [arguments] -exec [command] {} +

这里,+表示对于 find 命令的每个结果,[command] 只执行一次。所有结果都作为参数一起传递给 [command]。+ 不需要用\+.

{} \;仍然对and的使用感到困惑{} +

{} \;就像这样(为每个找到的结果执行命令):

ls file1.txt
ls file2.txt
ls file3.txt

{} +就像这样(使用所有结果参数执行命令一次):

ls file1.txt file2.txt file3.txt

虽然看起来 using{} +在这里是更好的选择,但事实恰恰相反。如果查找命令抛出 50 个结果,则不能将它们全部作为参数一起传递,因为对最大命令行长度有限制。

这就是为什么除非您{} \;确切知道自己需要什么,否则您会更好。

组合 find 和 exec 命令的实例

让我分享一些常见的find exec命令示例,以便您更好地理解它们。

1.查找并显示文件属性

在 find exec 命令的第一个简单示例中,我将显示 /tmp 目录下的所有锁定文件并显示它们的属性。

sudo find /tmp/ -type f -name *lock -exec ls -l {} \;

结果如下:

sagar@LHB:~$ sudo find /tmp/ -type f -name *lock -exec ls -l {} \; 
-r--r--r-- 1 gdm gdm 11 Jul 17 08:01 /tmp/.X1024-lock
-r--r--r-- 1 gdm gdm 11 Jul 17 08:01 /tmp/.X1025-lock

2.查找和重命名文件

是的,使用 find 和 exec 可以轻松地重命名文件。mv 命令用于重命名文件。我也会这样做。

sudo find /home/sagar/Downloads/ -type f -name 'ubuntu*' -exec mv {} {}_renamed \;

上面的命令查找以名称 ubuntu 开头的文件并将它们存储在占位符内。一旦将结果存储在占位符内的过程,它将在占位符内存储的每个文件的末尾添加“_renamed”。

使用 find 和 mv 重命名文件

 

3.收集和存储文件大小

在此示例中,我将向您展示如何收集特定目录下可用文件的大小并创建一个文件来保存给定的输出。

我将在 /tmp 目录下收集每个文件的大小,并将输出保存在 /root 目录下,文件名为 du_data.out

sudo find /tmp/ -type f -exec du -sh {} \; > /root/du_data.out

现在,让我们看看最近在 /root 目录下创建的文件是什么样子的。

收集文件大小并存储它们的 find exec 命令示例

4.删除带有特定参数的文件

自动删除文件时请格外小心。如果您不注意,这可能是灾难性的。要么使用交互式删除,rm -i要么首先查看查找命令的结果。

find exec 命令组合的另一个常见示例是查找大于特定大小的文件并将其删除。如果您正在清理旧日志,这很有效。

我正在删除大于 100 MB 的文件,以便在我的桌面目录下进行演示。

find ~/Desktop -size +100M -exec rm {} \;

同样,您也可以根据文件的存在时间来删除文件。例如,让我们删除超过 10 天的文件。

sudo find /tmp/ -type f -mtime +10 -exec rm {} \;

在这里,我使用了 -mtime 来识别过去 24 小时内修改的数据,当与 +10 配对时,它会发现并删除超过 10 天的文件。

5.执行特定工具

在各种情况下,您可能希望在找到文件后启动某些工具或包。

例如,当我搜索任何 mp3 文件时,我想运行 id3v2,它会带来有关找到的 mp3 文件的详细信息。

find . -name "*.mp3" -exec id3v2 -l {} \;

id3v2 是将显示有关 mp3 文件的详细信息的包,-l 用于显示与找到的 mp3 关联的每个 mp3 标签。

使用 id3v2 显示附有 mp3 文件的音乐标签

6.改变文件和目录的所有权

更改文件和目录的所有权是 find 和 exec 组合的强大功能的另一个例子。

在这里,我正在查找 named 用户拥有的文件sagar,然后将其所有权更改为milan.

sudo find /home/sagar/disk/Downloads -user sagar -type f -exec chown milan {} \;
使用 find exec 命令更改文件所有权

7、修改文件权限

那么如何使用 find 和 exec 更改文件的权限呢?

sudo find /home/sagar/disk/Downloads -type f -exec chmod 644 {} \;

在上面的命令中,我使用了 -type f 因此该命令将仅应用于给定目录下的文件。

更改文件的读写权限

 

8.收集每个文件的md5sum

在此示例中,我将演示如何为 /tmp 目录下的每个可用文件收集 md5sum。

sudo find /tmp/ -type f -exec md5sum {} \;

如您所见,应用的命令收集了每个可用文件的 md5sum 及其名称和 md5sum。

为 /tmp 下的每个文件收集 md5sum

但是,如果您想直接使用不同的名称保存此输出和特定内容怎么办?你只需要按照给定的命令直接相应地更改名称:

sudo find /tmp/ -type f -exec md5sum {} \; > /Documents/checksumdata.out

9.结合exec和grep命令

find 命令对文件名起作用。grep 命令作用于文件的内容。

将 find 和 grep 与 exec 结合在一起,您就可以在 Linux 命令行中获得一个强大的搜索工具。

例如,下面的命令搜索所有具有.hbs扩展名的文件。使用 grep,它会在这些 .hbs 文件的内容中搜索字符串“excerpt”。

find . -type f -name "*.hbs" -exec grep -iH excerpt {} \;

使用该-H选项,grep 命令将显示每个匹配项的文件名。这是输出:

sagar@LHB:~/Downloads/casper-hyvor$ find . -type f -name "*.hbs" -exec grep -iH excerpt {} \;
./author.hbs:                <div class="post-card-excerpt">{{bio}}</div>
./partials/post-card.hbs:            {{#if excerpt}}
./partials/post-card.hbs:                <div class="post-card-excerpt">{{excerpt}}</div>
./post.hbs:        {{#if custom_excerpt}}
./post.hbs:            <p class="article-excerpt">{{custom_excerpt}}</p>
./tag.hbs:                <div class="post-card-excerpt">

额外提示:使用多个 exec 命令查找

是的,您可以使用单个 find 命令链接多个 exec 命令。

让我以您在上一节中看到的相同示例为例,并使用两个 exec 命令。

find . -type f -name "*.hbs" -exec echo {} \; -exec grep excerpt {} \;

它将首先搜索 .hbs 文件,然后使用第一个 exec 命令回显它们的名称。然后,将在这些文件中搜索“摘录”字符串。

输出将与上一个命令中的输出略有不同:

sagar@LHB:~/Downloads/casper-hyvor$ find . -type f -name "*.hbs" -exec echo {} \; -exec grep excerpt {} \;
./index.hbs
./page.hbs
./default.hbs
./author.hbs
                <div class="post-card-excerpt">{{bio}}</div>
./error-404.hbs
./error.hbs
./partials/icons/twitter.hbs
./partials/icons/fire.hbs
./partials/icons/lock.hbs
./partials/icons/loader.hbs
./partials/icons/rss.hbs
./partials/icons/avatar.hbs
./partials/icons/facebook.hbs
./partials/post-card.hbs
            {{#if excerpt}}
                <div class="post-card-excerpt">{{excerpt}}</div>
./post.hbs
        {{#if custom_excerpt}}
            <p class="article-excerpt">{{custom_excerpt}}</p>
./tag.hbs
                <div class="post-card-excerpt">

结论

Find 是一个已经非常强大的命令,用于根据许多条件搜索文件。exec 命令使您能够处理 find 命令的结果。

我在这里分享的例子只是一瞥。find-exec 命令组合在一起为您提供了在 Linux 命令行中执行操作的无限可能。  

标签:文件,exec,命令,type,find,hbs
From: https://www.cnblogs.com/apexchu/p/17298067.html

相关文章

  • 0002 嵌入式开发带你从小白到大佬系列之——Linux文件系统、常用文件操作命令(一)及用户
    1、熟悉Linux的文件系统结构Linux的文件系统结构其实是一个树形的分层组织结构,如下图:Linux系统目录结构及目录路径:1.1、文件系统层次结构标准Linux是开源的操作系统,各个Linux发行机构都可以按照自己的需求对Linux系统的文件系统进行相应的裁剪,所以各个Linux发行版本的目录结......
  • python相关命令
    1,查看此电脑是否安装python,进入cmd,输入python  2,查看python安装的版本,进入cmd,输入python--version  3,查看python安装的路径,进入cmd,输入py-0p ......
  • linux命令 之 sudo命令详细介绍
    导读你在使用 Linux 命令行时曾经得到过“拒绝访问”的错误提示吗?这可能是因为你正在尝试执行一个需要root权限的操作。例如,下面的截图展示了当我尝试复制一个二进制文件到一个系统目录时产生的错误。你在使用Linux 命令行时曾经得到过“拒绝访问Permissiondenied......
  • 第三库FindXXX.cmake
    1、CURLinclude(../cmake/ExternalProjectHelper)if(${CMAKE_BUILD_TYPE}STREQUAL"Debug") find_external_project_add(NAMEcurl DEPENDS"openssl" CONFIGURE_COMMANDS-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}-DCMAKE_BUILD_TYPE......
  • mysqldump 命令导出数据,解决中文乱码问题
      https://www.cnblogs.com/LoveBB/p/16941639.html mysqldump-uroot-ppassword--add-drop-table--default-character-set=utf8--hex-blobdbname--result-file=F:\backup.sql......
  • Linux基本功系列之sudo命令
    1.sudo命令介绍sudo命令来自于英文词组“superuserdo”的缩写,中文译为“超级用户才能干的事”.sudo的功能是用于授权普通用户执行管理员命令,允许普通用户执行一些或者全部的root命令,如halt,reboot,shutdown、init等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。......
  • 线程池execute 和 submit 的区别
    1.execute和submit的区别前面说了还需要介绍多线程中使用execute和submit的区别(这两个方法都是线程池ThreadPoolExecutor的方法)。1.1方法来源不同execute方法是线程池的顶层接口Executor定义的,在ThreadPoolExecutor中实现:voidexecute(Runnablecommand);su......
  • 安装jar包到本地仓库命令
    打开cmd进入需要安装的jar包所在的目录,输入以下命令(前提是需要配置maven的环境变量,不然系统无法识别mvn命令)mvninstall:install-file-Dfile=xx-DgroupId=xx-DartifactId=xx-Dversion-xx-Dpackaging=xx举例:mvninstall:install-file-Dfile=ojdbc14-10.2.0.4.0.jar-Dgour......
  • Linux服务管理命令service与systemctl
    历史背景Linux系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务。历史版本中的linux对服务的操作是通过service来完成的。若创建用户自定义的服务,则需要较为复杂的操作。目前linux新的发行版已经内置了systemctl来操作服务。在早期服务管......
  • Linux服务管理命令service与systemctl
    历史背景Linux系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务。历史版本中的linux对服务的操作是通过service来完成的。若创建用户自定义的服务,则需要较为复杂的操作。目前linux新的发行版已经内置了systemctl来操作服务。在早期服务管......