Files

如何按文件類型查找文件?

  • April 8, 2022

我知道我可以使用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 類型。


使用filewithfind來檢測正常文件的 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命令將繼續輸出文件的路徑名(-print末尾的 ,也可以用其他操作替換)。

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來代替上面命令-print中的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 {} +

有關的:

引用自:https://unix.stackexchange.com/questions/483871