10在Linux/Unix中查找exec多个命令示例

时间:2020-01-09 10:38:22  来源:igfitidea点击:

在本文中,我将分享多个find exec示例。
对于每个系统管理员来说,"查找"是一个非常有用的实用程序,它可以处理日常任务,但是我们也可以结合使用find exec多个命令来过滤和执行某些任务。
例如:find exec grep一个模式并仅打印补丁文件,在管道中使用find exec,在Linux或者Unix中结合使用sed或者awk和fix exec。

查找exec多个命令的语法

查找的-exec标志会导致查找到的每个文件匹配一次执行给定命令,并且它将在我们放置{}占位符的位置放置文件名。
该命令必须以分号结尾,必须以';'或者as的形式从shell转义。

用于查找exec多个命令的语法:

find {PATH} [OPTIONS] -exec {COMMAND} {} ;

其中

PATH			Provide the path and locations where you wish to execute find exec grep
OPTIONS			Check man page of find command to get the list of all supported options with find
COMMAND			provide the command which you wish to combine with find
-exec command ;         Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the command
			until an argument consisting of `;' is encountered.  The string `{}' is replaced by the current file name being
			processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some 
			versions of find.
-exec command {} +	This variant of the -exec action runs the specified command on the selected files, but the command line is built by 
			appending each selected file name at the end; the total number of invocations of the command will be much less than 
			the number of matched files.

说明:

在本文中,我将假定我们具有使用find命令的基本知识,或者我们可以参考下面的文章以了解有关find命令及其用法的更多信息。

查找执行示例1:收集md5sum

在此find exec示例中,找到/tmp下的所有文件,并为每个文件收集md5sum

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

其中"-f"表示注意常规文件

类似地,我们可以使用find命令找到多个执行命令以收集所有文件的sha512sum或者sha256sum。
在同一find exec示例中,将输出存储到文件中

# find /tmp/-type f -exec md5sum {} \; > /root/checksum_datababse.out

查找执行示例2:删除早于特定时间的文件

在下面的查找执行示例中,我们将列出5天以上的文件

# find /tmp/-type f -mtime +5 -exec ls -l {} \;

删除5天以上的文件

# find /tmp/-type f -mtime +5 -exec rm -rvf {} \;

这里的-mtime表示文件的数据是n * 24小时前最后一次修改的

查找执行示例3:重命名文件

我们使用mv命令来重命名文件,我们可以将它与find和exec一起使用来重命名多个文件

# find/-type f -name 'file*' -exec mv {} {}_renamed \;

此命令我们使用find exec重命名文件,将找到的文件存储在{}中,然后使用_renamed扩展名重命名该文件。

结合find exec多个命令

我们可以在一行中组合find exec多个命令。
只要到目前为止,整个链的评估结果都为" true"," find"将继续一一运行。
因此,仅当先前的-exec命令返回true时(即命令的退出状态为0),才执行每个连续的-exec命令。

# find /tmp/dir1/-type f -exec chown root:root {} \; -exec chmod o+x {} \;

提示:

这等效于运行chown root:root文件&& chmod o + x文件

在Linux或者Unix中将find exec与grep结合

如果我们要查找具有某些内容的文件,则可以组合使用find exec grep,因此请使用find exec grep。
例如,在下面的示例中,我需要使用find exec grep包含字符串hynman的文件列表。
但是找到exec grep打印文件名其中不起作用,因为我们只得到匹配的字符串

# find /tmp/-type f -exec grep -i hynman {} \;
This is a dummy config file owned by hynman
This is a dummy config file owned by hynman
This is a dummy config file owned by hynman

结合查找exec grep打印文件名

现在,在上面的命令中,我们获得了包含hynman字符串的文件的输出列表。
但是它不打印文件名。
其中使用不同的方法查找exec grep打印文件名:在下面的示例中,我们将结合使用find exec打印文件名

# find /tmp/-type f -exec grep -i hynman {} \+
/tmp/dir2/text3:This is a dummy config file owned by hynman
/tmp/dir2/text1:This is a dummy config file owned by hynman
/tmp/dir2/text5:This is a dummy config file owned by hynman

或者,我们也可以使用以下命令来组合find exec grep打印文件名:

# find /tmp/-type f -exec grep -i "hynman" {} \; -exec echo {} \;
# find /tmp/-type f -exec grep -i "hynman" {} \; -print

结合查找exec shell脚本功能

我们可以结合使用find exec shell脚本功能。
在下面的示例中,我将结合使用find exec shell脚本函数来重命名文件(如果找到)

# find /tmp/dir1/-type f -exec bash -c '
for item do
[[ $item =~ "file1" ]] && mv -v $item ${item}_renamed
done
' bash {} +

遵循模式匹配以获取更多详细信息

将find exec与管道结合

我们可以将find exec与管道结合起来。
我们还可以将多个管道与find exec grep多个命令和字符串一起使用。
在下面的示例中,我将多次将find exec与管道结合在一起:

# find /tmp/dir1/-type f -exec sh -c 'egrep -i a "" | grep -i amit' sh {} \; -print

结合grep并找到具有sed的exec

我们可以将find exec与sed或者与awk结合使用,在以下示例中,我们将grep与find exec与sed结合使用

# find /tmp/dir1/-type f -exec grep hynman {} \; -exec echo -e {}"\n" \; | sed  's/hynman/deep/g'

其中

  • 我们在/tmp/dir1下找到所有文件

  • 在/tmp/dir1下找到的所有文件中的hynman的grep

  • 在STDOUT上打印输出

  • 使用sed并将hynman替换为deep

将find exec grep与cut或者awk结合

在下面的示例中,我们将find exec grep与cut结合使用,但是在同一命令中,我们可以将find exec grep与awk结合使用

# find /tmp/dir1/-type f -exec sh -c 'grep  hynman "$@" | cut -d":" -f1' {} +