如何按文件類型查找文件?
我知道我可以使用
find
:查找文件find . -type f -name 'sunrise'
。範例結果:./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise
我也知道我可以確定文件的文件類型:
file sunrise
. 範例結果:sunrise: PEM RSA private key
但是如何按文件類型查找文件?
例如
my-find . -type f -name 'sunrise' -filetype=bash-script
:./astronomy/sunrise ./schedule/sunrise
Unix 系統上的“文件類型”是諸如正常文件、目錄、命名管道、字元特殊文件、符號連結等之類的東西。這些是
find
可以使用其-type
選項過濾的文件類型。該
find
實用程序本身無法區分“shell 腳本”、“JPEG 圖像文件”或任何其他類型的正常文件。然而,這些類型的數據可以通過實用程序來區分,該file
實用程序查看文件本身內的特定簽名以確定它們的類型。標記不同類型數據文件的常用方法是通過它們的MIME 類型,並且
file
能夠確定文件的 MIME 類型。使用
file
withfind
來檢測正常文件的 MIME 類型,並使用它來僅查找 shell 腳本:find . -type f -exec sh -c ' case $( file -bi "$1" ) in (*/x-shellscript*) exit 0; esac exit 1' sh {} \; -print
或者,使用
bash
,find . -type f -exec bash -c ' [[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} \; -print
如果您只想檢測具有該名稱的腳本,請
-name sunrise
在之前添加。-exec
上面的
find
命令將在目前目錄中或目前目錄下查找所有正常文件,並為每個此類文件呼叫一個簡短的內嵌 shell 腳本。如果該命令的輸出包含字元串,則此腳本file -bi
在找到的文件上執行並以零退出狀態退出/x-shellscript
。如果輸出不包含該字元串,它將以非零退出狀態退出,這會導致find
立即繼續下一個文件。如果發現該文件是一個 shell 腳本,該find
命令將繼續輸出文件的路徑名(該
file -bi
命令將輸出文件的 MIME 類型。對於 Linux(和大多數其他系統)上的 shell 腳本,這將類似於text/x-shellscript; charset=us-ascii
而在具有稍舊版本的
file
實用程序的系統上,它可能是application/x-shellscript
公共位是
/x-shellscript
子字元串。請注意,在 macOS 上,由於某些原因,您必須使用
file -bI
而不是(該選項的作用完全不同)。macOS 上的輸出在其他方麵類似於 Linux 系統的輸出。file -bi``-i
你想對每個找到的 shell 腳本執行一些自定義操作嗎,你可以用另一個
-exec
來代替上面命令find
,但也可以這樣做find . -type f -exec sh -c ' for pathname do case $( file -bi "$pathname" ) in */x-shellscript*) ;; *) continue esac # some code here that acts on "$pathname" done' sh {} +
或者,與
bash
,find . -type f -exec bash -c ' for pathname do [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue # some code here that acts on "$pathname" done' bash {} +
有關的: