DontParseLs和DontReadLinesWithFor。
您提出的問題可以通過使用雙引號而不是單引號來解決,但是,您需要轉義任何您不打算讓shell解釋的shell元字符(換句話說,必須使用反斜槓 - 在地址範圍1,$
中避開美元符號,或在雙引號旁邊使用單引號,並可能更改爲不同的分隔符以應對變量$i
; '1,$'"s:^:$i:"
)的斜槓。
但是您的整個任務可以作爲一個命令執行。
IFS=$'\n' find $(cat listall) -mindepth 1 -maxdepth 2 -print >listZ
的IFS
只有嚴格必要的,如果listall
包含在其中空格的文件名。您原則上仍然需要轉義任何其他shell元字符(星號,方括號,問號)。更健壯的解決方法是
while read -r directory; do
printf '%s\n' "$directory"/* "$directory"/*/*
done <listall >listZ
(我誤解你的問題在第一,並承擔listall
包含文件名,目錄名無關。我讓我原來的答覆如下。)
sed "s:^:$i/:" listall >listZ
假設您實際上不需要需要第一行的空白空間(可能會將'1i\ '
添加到sed
腳本)。地址範圍1,$
是sed
中的默認值,因此指定它是多餘的。因爲每行只能有一個替換,所以標誌也是多餘的(這意味着,將一行中的所有事件替換爲一行,而不是僅替換第一行)。如果在$i
中可能有冒號,請使用不同的分隔符。
使用雙引號代替單引號在sed。 – 2015-04-02 06:34:43
正如我所說,我試過了,在這種情況下它不起作用。 (可能是因爲,如下面的paxdiablo所述,我的變量$ i包含一些'/'字符。 – 2015-04-02 07:34:24
可能在[sed腳本中的shell變量]重複(http://stackoverflow.com/questions/7006910/shell-variables-in- sed-script) – NeronLeVelu 2015-04-02 08:11:34