2011-05-18 30 views
19

我想輸出的項目列表中的文件夾中的如下因素的方法:如何在SINGLE行中輸出帶引號的文件名?

"filename1" "filename2" "file name with spaces" "foldername" "folder name with spaces" 

換句話說,項目名稱必須在一行上,用引號(單人或雙人)包圍,併除以空間。

我知道

find . | xargs echo 

打印輸出在一個單一的線,但我不知道如何添加圍繞每個項目名稱引號。

此代碼是bsh腳本的一部分。 該解決方案因此可以是一組命令並使用臨時文件來存儲中間輸出。

非常感謝您的任何建議。

乾杯,安娜

+0

如果目標是用空格將名稱傳遞給xargs,那麼文字引號就是錯誤的方法。 – 2015-12-14 22:21:36

回答

18

這應該工作

find $PWD | sed 's/^/"/g' | sed 's/$/"/g' | tr '\n' ' ' 

編輯:

這應該是比前一個更高效。

find $PWD | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' ' 

@ Timofey的解決方案最終會與tr一起工作,並且應該是最有效的。

find $PWD -exec echo -n '"{}" ' \; | tr '\n' ' ' 
+0

這很好用!非常感謝你。我的最終命令是:「find。!-type l \(-name。-o -prune \)| sort -n | sed's/^ /」/ g'| sed's/$ /「/ g'| tr'\ n'''| xargs myCommand」。這一行是myCommand的輸入參數。 – Ana 2011-05-18 08:29:39

+0

請不要。首先,如果你的'$ PWD'包含空格或擴展爲任何東西的文字全局字符,'find $ PWD'將表現得很糟糕。其次,用名稱周圍的雙引號替換它是一個弱而容易被繞過的機制 - 有效的文件名本身可以包含''''或'''字符,從而拋棄整個流的其餘部分的解析 – 2015-12-14 22:18:51

+0

@ Ana,如果在使用GNU工具('find -print0'和'sort -z')的系統上,使用'find ... -print0 | sort -n -z | xargs -0 myCommand' – 2015-12-14 22:19:26

13

試試這個。

find . -exec echo -n '"{}" ' \; 
+0

這不起作用,我得到了多行輸出 – Ana 2011-05-18 08:27:20

+0

@Ana爲我工作。 – 2011-05-18 08:35:34

+1

刪除-n以得到包含換行符的結果。 – xastor 2012-08-28 07:13:35

2
for f in *; do printf "'%s' " "$f"; done; echo 

或者,由於Gordon Davisson

printf "'%s' " *; echo 

尾隨echo很簡單,就是一個新行添加到輸出。

+2

這可以進一步簡化:'printf''%s'「*'。 – 2011-05-18 14:53:59

26

你也可以使用simlpy找到 「-printf」,如:

find . -printf "\"%p\" " | xargs your_command 

其中:

  %p  File's name. 

這將用引號括每一個找到的文件和各項目用空格分隔。 這可以避免使用多個命令。

+0

這應該被標記爲正確的答案。正則表達式操作太低級。 – 2016-08-24 22:17:54

+0

我必須在Windows上添加一個使用cygwin的新行,以使輸出相同:'-printf「\」%p \「\ n」' – jcarballo 2016-09-05 20:49:56

+1

-printf在OSX上不可用。 – Nimrod 2017-11-10 18:53:10

1

編輯:
以下的答案生成新行分開LIST代替單個線。

  1. 我第二猜測的OP使用結果用於調用其他命令
  2. 輸出列表轉換爲單條線容易(| tr '\n' ' '

一個不太提到的方法是使用-d--delimiter)選項xargs

find . | xargs [email protected] -d"\n" echo \"@\" 

[email protected]捕捉每個find結果作爲@,然後我們用引號

有了這個,你可以調用就像你加引號,參數中的任何命令回聲編它。

$ find . | xargs -d"\n" testcli.js 
[ "filename1", 
    "filename2", 
    "file name with spaces", 
    "foldername", 
    "folder name with spaces" ] 

https://stackoverflow.com/a/33528111/665507

9

您可以使用GNU ls選項--quoting-style輕鬆地得到你所追求的。從手冊頁:

--quoting-style=WORD

使用引用風格WORD的條目名稱:literallocaleshellshell-alwaysshell-escapeshell-escape-alwayscescape

對於例如,使用命令ls --quoting-style=shell-escape-always,你的輸出變爲:

'filename1' 'filename2' 'file name with spaces' 'foldername' 'folder name with spaces' 

使用--quoting-style=c,您可以準確地重現您想要的例子。但是,如果輸出將由shell腳本使用,則應使用正確轉義特殊字符的格式之一,如shell-escape-always

+1

相關:'ls -Q';#加雙引號 – splaisan 2017-09-20 10:06:10

相關問題