Bash
Bash - 在for循環中獲取包含空格的字元串
我正在嘗試編寫一個對子集中的每個目錄進行操作的 bash 腳本。不幸的是,路徑包含空格,我無法更改名稱。
for
循環堅持在每個空間打破; 我嘗試了數十種變體,但無法提出解決方案。簡化版本如下。
#!/bin/bash SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod" for file in `ls -d "$SOURCE"/201*` do echo "File: $file" done
誰能建議我如何獲取每個條目,例如
/Volumes/Time Machine Backups/Backups.backupdb/Zaphod/2017-06-30-215735
在一個單獨的變數中。
如果目錄中的文件沒有空格:
#!/bin/bash SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod" cd "$SOURCE" for file in $(ls -d ./201*) do echo "File: $file" done
如果不確定目錄列表中是否存在空格,請改為執行以下操作:
#!/bin/bash SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod" cd "$SOURCE" shopt -s nullglob for filename in 201*;do if [[ ! -d "$filename" ]];then echo "$filename" fi done shopt -u nullglob
我不清楚您是否想要目錄文件名,如果沒有,這就是有效的。
當您不知道是否有空格我相信時,第二個是通常首選的解決方案。
變化最小的解決方案是:
#!/bin/bash SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod" for file in "$SOURCE"/201* do echo "File: $file" done
另一種選擇(如果您在更改位置參數方面沒有問題):
#!/bin/bash SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod" set -- "$SOURCE"/201* for file; do echo "File: $file" done
一種更精確的解決方案,可以避免目錄並使用空格(但不是換行符)處理文件:
ls -dp "$a"/201* | grep -v '/$' | while read f; do echo "File:$f"; done
或者適用於任何名稱的解決方案,但也可能列出點文件(如果名稱匹配):
find "$a" -type f -name "201*" -exec echo "File: {}" \;