Bash
Bash 腳本轉義引號
我正在編寫一個 bash 腳本來查找文件夾中的所有圖像,並使用 ImageMagick 查找它們是否具有損壞的結尾。
這是我試圖自動化的命令:
identify -verbose *.jpg 2>&1 | grep "Corrupt" | egrep -o "([\`].*[\'])"
我遇到的問題是將辨識命令儲存到變數中。
命令中存在多種類型的引號我不斷收到錯誤第 8 行:損壞:找不到命令
#!/bin/bash # This script will search for all images that are broken and put them into a text file FILES="*.jpg" for f in $FILES do corrupt = "identify -verbose \"$f\" 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\"" if [ -z "$corrupt" ] then echo $corrupt else echo "not corrupt" fi done
有沒有辦法正確逃避該命令?
更新:
一些進展:
#!/bin/bash # This script will search for all images that are broken and put them into a text file FILES="*.jpg" for f in $FILES do echo "Processing $f" corrupt="identify -verbose $f 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\"" if [ -z "$corrupt" ] then echo $corrupt else echo "not corrupt" fi done
這不再引發錯誤,但看起來它只是將變數儲存為字元串。
如何執行此命令?
更新:一些進展。現在命令正在執行:
#!/bin/bash # This script will search for all images that are broken and put them into a text file FILES="*.jpg" for f in $FILES do echo "Processing $f" corrupt=`identify -verbose $f | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\"` $corrupt if [ -z "$corrupt" ] then echo $corrupt else echo "not corrupt" fi done
但是管道的輸出是分開的:
Processing sdfsd.jpg identify-im6.q16: Premature end of JPEG file `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387. identify-im6.q16: Corrupt JPEG data: premature end of data segment `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.
我只需要最後的**`sdfsd.jpg’**字元串。
您可能正在尋找一種辨識損壞圖像的方法。查詢該
identify
工具的退出狀態很容易,以查看它是否設法辨識圖像文件。#!/bin/sh for name in *.jpg; do if identify -regard-warnings -- "$name" >/dev/null 2>&1; then printf 'Ok: %s\n' "$name" else printf 'Corrupt: %s\n' "$name" fi done
以上使用退出狀態
identify
來確定文件是否損壞。該-regard-warnings
選項將您提到的警告升級為錯誤,這使它們影響實用程序的退出狀態。您很少需要將實際的通配模式儲存在變數中。您通常可以通過像我們上面顯示的那樣測試其退出狀態來獲取實用程序的成功/失敗狀態,而無需解析工具的輸出。
對於較舊的 ImageMagick 版本(我使用的是 6.9.12.19),請
convert
使用identify
.#!/bin/sh for name in *.jpg; do if convert -regard-warnings -- "$name" - >/dev/null 2>&1; then printf 'Ok: %s\n' "$name" else printf 'Corrupt: %s\n' "$name" fi done
上面的循環嘗試轉換每個圖像,如果它無法處理圖像文件,則由
if
語句檢測到。我們丟棄轉換操作的結果。