搜索“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 来修改文件名,能对付常见的任务。
No comments:
Post a Comment