ディレクトリを再帰的にクロールし、ファイルに最初の4バイトがある場合は、そのファイルで実行したいと\x58\x46\x53\x00
思います。strings
答え1
これがよく使用するファイル形式の場合は、~/.magic
それをユーザー(またはシステムマジックファイル)に定義します。
0 long 0x00534658 XFS-file
(リトルエンディアンシステムを使用していると仮定)。これで、file
次のコマンドを使用してテストできます。
$ file testfile
testfile: XFS-file
これをテストするためにこれを行うことができます。
if [[ `file -b testfile` == XFS-file ]]; then strings testfile; fi
答え2
h_signature=$(echo 58465300 | tr 'a-f' 'A-F')
read -r x a b x <<<$(od --endian=big -N 4 -t x2 yourfile | tr 'a-f' 'A-F')
case "$a$b" in "$h_signature" ) strings yourfile ;; esac
メチル-2:
dd if=yourfile count=4 bs=1 2>/dev/null |
perl -lpe '$_ = uc unpack "H*"' | xargs test "$h_signature" = && strings yourfile
メチル-3:
head -c 4 yourfile | xxd -ps -g 4 | grep -qwi "$h_signature" && strings yourfile
答え3
ファイルの最初の4バイトが特定の文字列XFS\0
(質問の16進バイトシーケンスに対応する文字列)であることを確認するには、次の手順を実行します。
if od -N 4 -a file | grep -qF 'X F S nul'; then
strings file
fi
od -N 4 -a
ファイルの最初の4バイトをシングルバイト文字表示形式に変換します。私たちはこれを使って、私たちが探しているものと比較して出力をテストしますgrep -qF
。od
リトルエンディアンシステムでは、od -N 4
追加のフラグなしでgrepを使用できます043130 000123
。
または:
if od -N 4 -A n -c file | tr -d ' ' | grep -qF 'XFS\0'; then
strings file
fi