Thursday, January 21, 2021

LINUX find 命令来查找文件

搜索“linux find 命令”关键词可以找到很多中文解释的 find 的用法。这里不一一列举了。

我这里列出英文互联网上对这个命令用法的提问和回答。

+++++

第一个例子,链接点这里

find . -name  * -exec ls -a {} \;

回复的人提供很有用的资料,比如 explainshell,比如  A Unix/Linux “find” Command Tutorial

 

+++++ $'\0' +++++

第二个例子,链接在这里

read -r -d $'\0'

-r -d 是 read 的两个 options,-d $'\0\ 是一起的。-d 后面是 delimiter。那到底 $'\0' 是个什么 delimiter?最佳回复说得很详细。

为什么要提到这个?在第一个例子中的那篇英文 tutorial 里说到,find 命令的 -print0 将找到的文件用这个 delimiter 串起来。这种做法十分常见,因为这个分界符不是文件名的合法符号。

 

++++

第三个例子。

#!/bin/bash

find . -type f -iname "*txt" -print0 | while read -d $'\0' FILE; do

        NEWFILE=$(echo "${FILE}" | sed -e 's/\.txt/.pdf/gI')

        mv "${FILE}" "${NEWFILE}"

done

find 用到了三个选项,分别是 -type 和 -iname 和 -print0。

因为 find 用到了 -print0,read 用了 -d $'\0' 来读文件。

然后用 sed 将文件名中的 .txt 改成了 .pdf,这个只在输出流中修改了,要实际修改文件,要用 mv 来操作。

还用到了

这么一小段 script 可以用来批量修改文件名,可以根据你的需要定制。这个例子有很多人回复。核心部分其实都在 sed,它可以做出各种更改,当然要与 regular expression 配合。

更多例子例子

+++++ 

第四个例子,链接在这里

只解释 John1024 的回复,因为他用到了 printf 和 sed。

他首先建了一个 bash indexed array。

months=(01 Jan 02 Feb 03 Mar 04 Apr 05 May 06 Jun 07 Jul 08 Aug 09 Sep 10 Oct 11 Nov 12 Dec)

然后用 printf -v 将 printf 的输出结果不显示在 standout 上,而是存到了一个变量 cmd 里。

printf -v cmd 's/[[:digit:]]{2}-%s-[[:digit:]]{4}/%s/g; ' "${months[@]}"

这个变量后来供给 sed 用。

我们可以查看这个变量。

echo "${cmd}"

然后做了 sed:

echo '01-02-2003 01-12-2004' | sed -re "$cmd"

得到需要的输出结果。

+++++

也可以在 macOS 上用 Homebrew 安装一个 rename 来修改文件名,能对付常见的任务。

Linux 系统上 rename 多个版本。很多简单的改名都可以用 rename 来操作。

No comments:

Post a Comment