Bash

bash 命令列印文件名和內容

  • April 30, 2021

我們有一個包含大量項目的 git 儲存庫,每個項目都有一個 OWNERS 文件,其中一行像 ’teams/search’ 沒有引號。我想以某種方式找到所有這些文件並在元組所在的位置創建一個元組數組

$$ filename, filecontents $$. 我可以找到所有文件

find java -name "OWNERS" 

很好,或者我可以像這樣對內容進行分類

find java -name "OWNERS" | cat

我怎樣才能創建數組呢?之後的下一步是遍歷數組(我想我知道如何做到這一點,儘管我的 bash 生鏽了),我可以通過 cd 創建符號連結到團隊目錄和 ln -s {full file path}

bash 資料結構不夠複雜,無法創建元組數組。您可以創建字元串數組或關聯數組。

我假設 OWNERS 文件的路徑名中沒有換行符。

# an array of OWNERS filenames
mapfile -t owner_files < <(find java -name OWNERS)

# an associative array mapping the filename to the contents
declare -A owner_file_contents
for file in "${owner_files[@]}"; do
   owner_file_contents["$file"]=$(<"file")
done

# inspect the associative array
declare -p owner_file_contents

Bash 對名稱中帶有空格的文件名非常敏感,因此您需要引用所有變數。

一些注意事項:

  • mapfile -t ary < <(some command)some command在子shell 中執行並將輸出讀入一個數組,每個元素一行。

    • 這無法完成,some command | mapfile -t ary因為 bash 在單獨的子 shell 中執行管道命令,這意味著數組將在子 shell 中創建,因此當子 shell 退出時數組將消失。
    • refs: mapfilecommand , 3.5.6 程序替換
  • $(<file)``$(cat file)是一種無需呼叫外部命令的內置方式。記錄在3.5.4 命令替換中

引用自:https://serverfault.com/questions/1060822