Bash
(tr n 0 <file.txt) 是什麼意思?
上下文:https
://stackoverflow.com/a/13941223/15603477 我明白xargs chmod 755 <file.txt
對於更大數量的文件,或輸入文件中幾乎任意數量的行…
對於許多 binutils 工具,如 chown、chmod、rm、cp -t …
xargs chmod 755 <file.txt
如果您在 file.txt 中有特殊字元和/或很多行。
xargs -0 chmod 755 < <(tr \\n \\0 <file.txt)
我不確定
(tr \\n \\0 <file.txt)
是什麼意思?在man tr中,我發現以下內容:
\\ backslash \n new line
\\
表示反斜杠,但這裡有兩個轉義級別。首先,shell 查看命令行並處理引號,這裡
\\n
變成\n
. 同樣,一個人可以寫,'\n'
或者"\n"
,他們也會產生\n
。然後,
tr
看到\n
並認為它意味著換行符。類似地\\0
轉向\0
,這意味著 NUL 字節,即數值為零的字節。想法是將輸入從使用換行符分隔路徑名的輸入轉換為使用 NUL 字節分隔它們的輸入。NUL 是一個自然分隔符,因為它是唯一在路徑名中無效的字元,也是阻止它對輸入進行其他特殊處理的
-0
選項:預設情況下處理引號(以它自己的方式,與 shell 的引用規則不完全兼容),並且將任何空格視為分隔符。最好不要使用 plain 。xargs``xargs``xargs
然而,該
-0
選項不是標準的,但得到了相對廣泛的支持。此外,通過這樣的轉換,您仍然無法表示包含換行符的文件名,但您可以表示其他所有內容,包括空格和引號。這個
<(...)
東西叫做程序替換,它提供了一個命令的輸出,就像它是一個文件一樣讀取。這是管道的一種概括,在這裡,可以用一個來代替。我會寫
xargs -0 chmod 755 < <(tr \\n \\0 <file.txt)
作為
tr '\n' '\0' <file.txt | xargs -0 chmod 755
(再次,
\\n
='\n'
)