怎样在 exec 中使用 find 命令

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

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

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

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

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

  • 使用 xargs
  • 使用执行

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

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

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

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

这是一个快速的解释:

  • [command] 是您要对 find 命令给出的结果执行的操作。
  • {} 是一个占位符,用于保存 find 命令给出的结果。
  • ; 表示对于每个找到的结果, [command] 被执行。 你需要逃避 ; 在这里,因此 ;。

⚠️{}和之间必须有空格;

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

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

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

仍然对使用感到困惑 {} ;{} +?

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

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

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

ls file1.txt file2.txt file3.txt

虽然它可能看起来像使用 {} + 是这里更好的选择,恰恰相反。 如果 find 命令抛出 50 个结果,则不能将它们全部作为参数一起传递,因为最大命令行长度存在限制。

这就是为什么你会更好 {} ; 除非你确切地知道你需要什么。

结合 find 和 exec 命令的实际例子

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

1.查找并显示文件属性

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

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

结果如下:

[email protected]:~$ 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”。

3. 收集和存储文件大小

在这个 example,我将向您展示怎样收集某个目录下可用文件的大小并创建一个文件来保存给定的输出。

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

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

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

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

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

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

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

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

同样,您也可以根据文件的年龄来删除文件。 为了 example,让我们删除超过 10 天的文件。

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

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

5.执行特定工具

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

为了 example,当我搜索任何 mp3 文件时,我想运行 id3v2 这将带来有关找到的 mp3 文件的详细信息。

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

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

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

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

更改文件和目录的所有权是另一回事 example find 和 exec 的组合有多强大。

在这里,我正在寻找名为的用户拥有的文件 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

在这个 example,我将演示怎样为 /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 命令行搜索工具。

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

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

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

[email protected]:~/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 命令。

让我也一样 example 您在上一节中看到并使用两个 exec 命令。

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

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

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

[email protected]:~/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 命令行中执行操作的无限可能。