假如你有一個(gè)多層級(jí)文件夾痢畜,它包含了很多jpg文件以及子文件夾(也有jpg文件)〕婕福現(xiàn)在你想把所有文件批量重命令黑低,比如把jpg擴(kuò)展名改為png赘艳,或者把里面的IMG字符改為abc,可以用下面的命令克握。
新建一個(gè)文件(比如file.sh)蕾管,內(nèi)容如下,并用chmod a+x file.sh
命令賦予可執(zhí)行權(quán)限菩暗。
#!/bin/bash
find . -type f -name '*.jpg' -exec sh -c '
for f; do mv "$f" "${f//.jpg/.png}";
done' sh {} +
從左到右依次解釋如下
-
find
文件查找命令 -
.
代表從當(dāng)前目錄中查找掰曾,可改為要查找的目錄 -
-type f
指定查找的文件類型,f
代表普通文件regular file停团;如果只查找目錄旷坦,可以用d
-
-name '*.jpg'
指定要查找的文件名,注意這里要區(qū)分大小寫
佑稠!如果不需要區(qū)分大小寫的話秒梅,用-iname
。后面的'*.jpg'
使用了通配符舌胶,*
表示任意長(zhǎng)度的字符捆蜀,?
表示單個(gè)字符。注意:要使用引號(hào)把文件名保護(hù)起來(lái) -
-exec COMMAND {} +
針對(duì)所有符合條件的文件,執(zhí)行它后面的命令辆它,下面詳細(xì)解釋后面的命令: -
sh -c
提供了一個(gè)受保護(hù)的命令環(huán)境(contained environment context
)誊薄,-c
后面跟著要執(zhí)行的命令,如果不用-c
的話娩井,會(huì)進(jìn)入用戶交互模式暇屋,等待用戶輸入命令。 -
for f; do COMMAND; done
命令解釋:用for
命令遍歷前面find
命令的查找結(jié)果洞辣,依次把某個(gè)結(jié)果放在變量f
中咐刨,然后在COMMAND
中對(duì)f
進(jìn)行操作,比如ls $f
-
mv "$f" "${f//.jpg/.png}"
:這里執(zhí)行的是重命名mv
的操作扬霜,"$f"
是舊的文件名定鸟,在構(gòu)建新的文件名時(shí),進(jìn)行了替換操作著瓶,把.jpg
替換成.png
联予。注意:假如文件名中有多個(gè).jpg
,如果只想替換第一個(gè)匹配字符材原,使用"${f/.jpg/.png}"
沸久;如果想替換所有的匹配字符,使用"${f//.jpg/.png}"
余蟹。差別在于f
后面是一個(gè)/
(單次)還是兩個(gè)/
(全局)卷胯。
另外:
如果想指定目錄深度(比如2級(jí)),可以使用
-maxdepth 2
威酒,如果設(shè)置為1
則只查找當(dāng)前目錄窑睁。關(guān)于
-exec command {} +
的詳細(xì)說(shuō)明,參考這里:
-exec command {} +
This variant of the -exec option 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. The command line is built in much the same way that xargs builds its command lines. Only one instance of '{}' is allowed within the command. The command is executed in the starting directory.
在macOS 10.13.6 High Sierra上測(cè)試通過葵孤。