管道符 |
允許將一個命令的輸出作為另一個命令的輸入。然而,管道符在處理某些型別的輸入時存在侷限性,特別是當需要將一系列輸入項作為單個命令的多個引數時()。
xargs
的出現正是為了解決這個問題。xargs
能夠從標準輸入(stdin)讀取資料,並將這些資料轉換為特定命令的引數列表。這使得 xargs
在處理大量輸入項時非常有用,特別是當這些輸入項需要作為單個命令的多個引數時。
以下是一些 xargs
相對於管道符 |
的優勢:
-
引數構建:
xargs
可以將多個輸入項組合成一個引數列表,然後一次性傳遞給命令。這對於需要處理大量檔案或資料的場景特別有用。 -
處理複雜輸入:
xargs
提供了多種選項來處理複雜的輸入,比如指定分隔符(-d
)、限制每次命令執行的引數個數(-n
)以及使用自定義的佔位符(-I
)。 -
安全性:在處理包含空格、換行符等特殊字元的檔名時,
xargs
的-0
選項可以與find
命令的-print0
選項結合使用,以確保正確處理這些特殊字元。 -
靈活性:
xargs
可以與其他命令和工具結合使用,以構建複雜的命令列管道。例如,你可以將find
命令的輸出透過管道傳遞給xargs
,然後使用xargs
來執行rm
命令刪除找到的檔案。
tr命令
tr
主要用於替換或刪除檔案中的字元。tr
命令透過從標準輸入讀取資料,然後對其進行處理,並將結果輸出到標準輸出(通常是螢幕,但也可以重定向到檔案)。
常用選項
-c
或--complement
:取字符集的補集,即處理不在指定字符集中的字元。-d
或--delete
:刪除指定字符集中的字元。-s
或--squeeze-repeats
:將連續的重複字元壓縮為一個。-t
或--truncate-set1
:將SET1
截斷為與SET2
相同的長度。
tr [OPTION]... SET1 [SET2]SET1:指定要轉換或刪除的字符集合。
SET2:指定用於替換 SET1 中字元的字符集合(如果提供)。如果 SET2 的長度小於 SET1,則 SET2 會被重複以匹配 SET1 的長度。如果 SET2 未提供,則 SET1 中的字元會被刪除。
示例
- 將小寫字母轉換為大寫字母:
echo "hello world" | tr 'a-z' 'A-Z'
- 刪除檔案中的數字:
echo "abc123def456" | tr -d '0-9'
- 將連續的空格壓縮為一個空格:
echo "This is a test." | tr -s ' '
- 使用補集刪除所有非字母字元:
echo "Hello, World! 123" | tr -cd 'a-zA-Z'
輸出:
HelloWorld
綜合示例
echo "file1,txt:file2,txt:file3,txt" | tr ':,' '\n' | xargs -n 2 ls -l
輸出結果
ls: cannot access 'file1.txt': No such file or directory ls: cannot access 'file2.txt': No such file or directory ls: cannot access 'file3.txt': No such file or directory
拆解
echo "file1,txt:file2,txt:file3,txt" | tr ':,' '\n'file1.txt
file2.txt
file3.txt
-
| tr ':,' '\n'
管道符號
|
將echo
命令的輸出作為tr
命令的輸入。tr
命令是一個字元轉換工具,這裡它被用來將輸入字串中的:
和,
替換為換行符\n
。注意,雖然這裡指定了兩個要替換的字元(:
和,
),但只給出了一個替換字元(\n
),這意味著:
和,
都會被替換為\n
。因此,每個檔名(及其後面的,txt
部分)都會被放在新的一行上。
示例2
echo "file1.txt:file2.txt,file3.txt;file4.txt" | tr ':,;' '\n' |xargs ls -l ls: cannot access 'file1.txt': No such file or directory ls: cannot access 'file2.txt': No such file or directory ls: cannot access 'file3.txt': No such file or directory ls: cannot access 'file4.txt': No such file or directory