在目錄中,有幾個文件,如:文件的UNIX串連列表分爲上線
file1
file2
file3
有沒有一種簡單的方法來連接這些文件得到一個線(由「或」連接)慶典如下:
file1 OR file2 OR file3
或者我需要寫一個腳本呢?
在目錄中,有幾個文件,如:文件的UNIX串連列表分爲上線
file1
file2
file3
有沒有一種簡單的方法來連接這些文件得到一個線(由「或」連接)慶典如下:
file1 OR file2 OR file3
或者我需要寫一個腳本呢?
你可以簡單地做到這一點與
printf '%s OR ' $(ls -1 *) | sed 's/OR $/''/'; echo -e '\n'
哪裏ls -1 *
是目錄。
如果文件名有空格,這將不起作用 – RomanPerekhrest
你應該避免在Linux上使用空格的文件名,但你是對的。我認爲OP文件名不含空格 – Vinny
請仔細閱讀:[爲什麼不應該解析'ls'的輸出](http://mywiki.wooledge.org/ParsingLs) – anubhava
應該考慮的時刻是一個文件名可能包含空格(s)。
使用以下LS + AWK溶液:
ls -1 * | awk '{ r=(r)? r" OR "$0 : $0 }END{ print r }'
解決方法爲使用新行的文件名(多個):
echo -e $(ls -1b hello* | awk -v RS= '{gsub(/\n/," OR ",$0); gsub(/\\ /," ",$0); print $0}')
-b
- LS選項來打印用於非圖形符號的C型逃逸[爲什麼*不*解析'ls'?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls) – anubhava
@Kent,你沒有得到它。我沒有說我會處理空間 - 我說這是一個重要的時刻。這就是爲什麼'ls -1'已被使用 – RomanPerekhrest
@anubhava,你測試過像'hello \ name'這樣的文件名嗎?另外,請閱讀我對Kent的評論 – RomanPerekhrest
您可以使用此功能與" OR "
作爲分隔打印所有的文件名(包括那些與空間,換行符或特殊字符)(假設你的文件名不包含ASCII碼4
):
orfiles() {
local IFS=$'\4'
local out="$*"
echo "${out//$'\4'/ OR }"
}
然後將其稱爲:
orfiles *
工作原理:
IFS
(內部字段分隔符)爲ASCII 4
在本地局部變量out
功能"$*"
輸出裏面。這將在變量$out
中的每個文件名之後放置\4
。\4
" OR "
,同時打印輸出$out
。在Unix系統中IFS
只有單個字符定界符因此它不能存儲多字符串" OR "
,我們必須做到這一點在2個步驟,如上所示。
ls -1|awk -v q='"' '{printf "%s%s", NR==1?"":" OR ", q $0 q}END{print ""}'
的LS & awk的方式做到這一點,以實例包含空格的文件名:
kent$ ls -1
file1
file2
'file with OR and space'
kent$ ls -1|awk -v q='"' '{printf "%s%s", NR==1?"":" OR ", q $0 q}END{print ""}'
"file1" OR "file2" OR "file with OR and space"
如果你正在解析ls的輸出,-q會把文件名放在引號中,所以ls -1Q會給「file1」「file2」 –
謝謝! @RamanSailopal – Kent
$ for f in *; do printf '%s%s' "$s" "$f"; s=" OR "; done; printf '\n'
file1 OR file2 OR file3
那你嘗試和失敗?即使它只是簡單的發佈 – Inian