
我看到下面的帖子可以幫助我獲取每個 .tgz 檔案中的總行數,但我只想計算這個壓縮的 .tgz 資料夾中 .js 檔案的行數,而不是全部。我該怎麼做?
答案1
您想要提取與 stdout 相符的所有檔案*.js
並用於wc -l
計算行數:
tar -x -f file.tgz -O --wildcards '*.js' | wc -l
-O
輸出到 stdout,而不是將檔案寫入磁碟(如 tar 通常所做的那樣)。
--wildcards
允許您在提取的檔案名稱中使用通配符(這可能僅限於 GNU,儘管在 Linux 上您將擁有該通配符)。
這將生成一個 tar 檔案。如果有多個,則可以在循環中執行此操作,並將循環的輸出通過管道傳輸到wc -l
.
答案2
.js
若要取得壓縮 tar 檔案中每個檔案的行數,請嘗試:
tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js'
作為演示,讓我們從這個存檔開始:
$ tar --list -f file.tgz
a.js
dir1/
dir1/b.js
other.txt
現在,讓我們取得存檔中每個 js 檔案的行數:
$ tar -xf file.tgz --to-command='echo " $TAR_FILENAME $(wc -l)"' --wildcards '*.js'
a.js 10
dir1/b.js 15
改進
如果我們想要更好的輸出格式,我們可以printf
使用echo
:
$ tar -xf file.tgz --to-command='printf "%-10s %s\n" "$TAR_FILENAME" "$(wc -l)"' --wildcards '*.js'
a.js 10
dir1/b.js 15
怎麼運作的
-x
告訴 tar 提取文件。-f file.tgz
告訴 tar 從 中提取file.tgz
。--to-command='echo "$TAR_FILENAME $(wc -l)"'
告訴 tar 將此命令應用於每個提取的檔案。 Tar 提供環境變數中每個檔案的名稱$TAR_FILENAME
。--wildcards
告訴 tar 使用 glob 選擇要提取的檔案。'*.js'
指定要擷取的檔案 glob。