Bash
查找具有最小 4 位數字的文件
我有很多很多表格文件,
[a-zA-Z]+\d\.\d{2}\_\d.\d{4}.end
想找到之前 4 位數字最小的文件.end
。(如果發生碰撞,我想要所有文件)你怎麼能用 Bash 做到這一點?
sort
顯然,由於字典順序,單獨工作是行不通的。
使用 Bash
find
以及sort
-t|--field-separator
and-k|--key
選項:
find_files.sh
:#!/bin/bash first_file=$(find . -iname '*.end' | sort -t '.' -k 4.1 | head -1) IFS='.' fields=($first_file) unset IFS find . -iname "*${fields[3]}.end"
-k|--key
選項需要 a的KEYDEF
形式field_number **。**字元號。生效時-t|--field-separator
,將根據指定的分隔符(在本例中.
為 )而不是空格來計算欄位編號。然後,我們使用 Bash 的輸入欄位分隔符從第一個文件中提取所需的模式,並再次在目錄中搜尋與
find
該模式匹配的文件,以防多個文件共享相同的 4 位數字。例子:
$ ls -1 abc0.03_1.1921.end def0.03_9.0311.end ghi0.03_1.1966.end jkl1.04_1.1916.end mno2.04_4.9540.end pab9.04_1.1994.end uvx7.04_3.2002.end yyy1.05_8.0311.end zzz4.04_1.2097.end $ ./find_files.sh ./yyy1.05_8.0311.end ./def0.03_9.0311.end
使用 GNU 工具,您可以執行以下操作:
find . -regextype posix-extended \ -regex '.*/[a-zA-Z]+[0-9]\.[0-9]{2}_[0-9]\.[0-9]{4}\.end' -print0 | awk -v RS='\0' -F . ' NR == 1 || $(NF-1) < min {files=$0; min = $(NF-1); next} $(NF-1) == min {files = files "\n" $0} END {if (NR) print files}'
這是一個常見模式的範例:我們列印以 NUL 分隔的匹配文件列表(因為 NUL 是文件路徑中唯一不能出現的字元)並處理該輸出,
awk
其中記錄分隔符已設置為 NUL (並非所有awk
實現都支持這一點)。欄位分隔符設置
.
為。NF
是欄位數,$(NF-1)
最後一個欄位也是如此。awk
通過與最後一個已知值比較找到最小的數字,並將相應的文件儲存在files
awk
變數中。當我們儲存列表換行符而不是 NUL 分隔時,這僅用於使用者輸出。如果您想可靠地對其進行後處理,則需要改用 NUL(
"\0"
在 awk 中)。