text / xargs === ###### tags: `OS / Ubuntu / cmd / text` ###### tags: `OS`, `Ubuntu`, `linux`, `command`, `text`, `xargs` <br> [TOC] <br> ## [K8s 應用] 列出某個 namespace 底下的所有 namespaced 資源 > gpt-o4-mini-high (2025/06/19) 要列出某個 namespace(例如 `tj-slurm`)底下的所有「可列舉(listable)」namespaced 資源,可以這麼做: ```bash kubectl api-resources \ --verbs=list \ --namespaced \ -o name \ | xargs -n 1 -I {} kubectl get {} -n tj-slurm --ignore-not-found ``` 解釋一下這條指令在做什麼: 1. `kubectl api-resources --verbs=list --namespaced -o name` 列出所有支援 `list` 操作且是 namespaced 的資源名稱(例如 `pods`、`deployments.apps`、`configmaps`…)。 2. `xargs -n 1 -I {} kubectl get {} -n tj-slurm --ignore-not-found` 把每一個資源名稱都透過 `kubectl get <資源> -n tj-slurm` 去取得這個 namespace 底下的物件, `--ignore-not-found` 讓它遇到資源種類在這個 namespace 沒啟用也不會報錯。 <br> ### 參數說明 `xargs` 是一個用來把標準輸入(stdin)文字,轉換成命令列參數並執行指定命令的工具。下面針對常用的幾個參數做說明,以你的範例為主。 ```bash kubectl api-resources --verbs=list --namespaced -o name \ | xargs -n 1 -I {} kubectl get {} -n tj-slurm --ignore-not-found ``` - ### `-n <count>` - **功能**:每次執行命令時,從輸入中取 `<count>` 個參數,放到一次命令呼叫裡。 - **範例**: - `-n 1`:每次只取一個(最常見的用法)。 - 如果不用 `-n`,預設會盡可能多地把所有參數傳給一次執行(一次呼叫)——但有時候一次傳太多參數會超過系統限制或不符合命令預期。 - ### `-I <replace-str>` - **功能**:指定一個「替換字串」`<replace-str>`,每讀到一筆輸入,就把這個字串替換成輸入的內容,再呼叫一次目標命令。 - **範例**: ```bash echo pod deployment | xargs -n 1 -I {} kubectl get {} -n my-namespace ``` - 先讀到 `pod`,執行 `kubectl get pod -n my-namespace` - 再讀到 `deployment`,執行 `kubectl get deployment -n my-namespace` - ### 組合起來的效果 - `kubectl api-resources … -o name` 會輸出所有可 list 的 namespaced 資源名稱,一行一個,像: ``` pods deployments.apps configmaps secrets … ``` - `xargs -n 1 -I {} kubectl get {} -n tj-slurm --ignore-not-found` 1. 每次只讀一行(`-n 1`),把那一行的文字代入 `{}`(`-I {}`)。 2. 執行 `kubectl get <that-resource> -n tj-slurm --ignore-not-found`。 3. 如果該資源在該 namespace 底下沒有物件,`--ignore-not-found` 不會報錯,僅跳過。 - ### 其他常見參數(補充) - `-P <max-procs>`:同時平行執行 `<max-procs>` 個子進程,例如 `-P 4` 一次同時跑 4 個。 - `-d <delimiter>`:指定輸入分隔符,預設是空白或換行。 - `--max-args`:等同 `-n`。 - `--replace`:等同 `-I`。 - ### 小結 - **`-n 1`**:一次拿一個參數去呼叫命令。 - **`-I {}`**:把命令裡的 `{}` 替換成目前讀到的參數。 這兩個參數搭配起來,就能把「多筆輸入」拆成「多次單筆命令」,逐一執行。 <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up