2017-09-19 51 views
-2

在目錄中,有幾個文件,如:文件的UNIX串連列表分爲上線

file1 
file2 
file3 

有沒有一種簡單的方法來連接這些文件得到一個線(由「或」連接)慶典如下:

file1 OR file2 OR file3

或者我需要寫一個腳本呢?

+2

那你嘗試和失敗?即使它只是簡單的發佈 – Inian

回答

1

你可以簡單地做到這一點與

printf '%s OR ' $(ls -1 *) | sed 's/OR $/''/'; echo -e '\n' 

哪裏ls -1 *是目錄。

+5

如果文件名有空格,這將不起作用 – RomanPerekhrest

+0

你應該避免在Linux上使用空格的文件名,但你是對的。我認爲OP文件名不含空格 – Vinny

+2

請仔細閱讀:[爲什麼不應該解析'ls'的輸出](http://mywiki.wooledge.org/ParsingLs) – anubhava

1

應該考慮的時刻是一個文件名可能包含空格(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型逃逸
+1

[爲什麼*不*解析'ls'?](https://unix.stackexchange.com/questions/128985/why-not-parse-ls) – anubhava

+0

@Kent,你沒有得到它。我沒有說我會處理空間 - 我說這是一個重要的時刻。這就是爲什麼'ls -1'已被使用 – RomanPerekhrest

+0

@anubhava,你測試過像'hello \ name'這樣的文件名嗎?另外,請閱讀我對Kent的評論 – RomanPerekhrest

2

您可以使用此功能與" OR "作爲分隔打印所有的文件名(包括那些與空間,換行符或特殊字符)(假設你的文件名不包含ASCII碼4):

orfiles() { 
    local IFS=$'\4' 
    local out="$*" 
    echo "${out//$'\4'/ OR }" 
} 

然後將其稱爲:

orfiles * 

工作原理:

  1. 我們設置IFS(內部字段分隔符)爲ASCII 4在本地局部變量out功能
  2. 我們店裏的"$*"輸出裏面。這將在變量$out中的每個文件名之後放置\4
  3. 最後使用BASH字符串替換,我們全局替換\4" OR ",同時打印輸出$out

在Unix系統中IFS只有單個字符定界符因此它不能存儲多字符串" OR ",我們必須做到這一點在2個步驟,如上所示。

+1

'++',最佳答案!明智地說,爲什麼'IFS'被設置並以這種方式取代。原因是'bash'不允許像'Awk'或其他工具那樣使用多字符'IFS' – Inian

+1

非常感謝@Inian。添加了我的答案。 – anubhava

+0

爲什麼用'\ 4'而不是NUL'\ 0'? –

0
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" 
+0

如果你正在解析ls的輸出,-q會把文件名放在引號中,所以ls -1Q會給「file1」「file2」 –

+0

謝謝! @RamanSailopal – Kent

0
$ for f in *; do printf '%s%s' "$s" "$f"; s=" OR "; done; printf '\n' 
file1 OR file2 OR file3