如何計算 tgz 壓縮檔案中特定檔案類型的行數?

如何計算 tgz 壓縮檔案中特定檔案類型的行數?

我看到下面的帖子可以幫助我獲取每個 .tgz 檔案中的總行數,但我只想計算這個壓縮的 .tgz 資料夾中 .js 檔案的行數,而不是全部。我該怎麼做?

https://stackoverflow.com/questions/22064932/count-number-of-lines-of-gz-files-recursviely-on-directory

答案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。

相關內容