我在一個目錄中有多個文本檔案。最后我想附加一個字串。
例如。目錄中的文本檔案串列。
- 一個.txt
- b.txt
- c.txt
獲取路徑的命令:
find -name "*txt"
然后我嘗試發送
'echo "example text" > <filename>
所以我嘗試運行以下命令:
find -name "*txt" | xargs echo "example_text" >>
此命令失敗。
我只想時不時地在檔案中附加一些文本,并且由于檔案的名稱不斷變化,我想使用 xargs
uj5u.com熱心網友回復:
xargs這里真的不太合適。也許是檔案名的回圈,例如
for file in *.txt; do
echo "example_text" >>"$file"
done
uj5u.com熱心網友回復:
因為>>是一個 shell 指令,如果你想通過 xargs 來處理它,你需要讓 xargs 啟動一個 shell。正如肖恩的回答所表明的那樣,在許多情況下,shell glob 就足夠了,您根本不需要find;但如果您確實想使用find,無論有無 xargs 都可以正確使用。
如果您堅持使用xargs,即使它不是作業的最佳工具...
find -name "*.txt" -print0 | xargs -0 sh -c '
for arg in "$@"; do echo "example_text" >>"$arg"; done
' _
取出xargs,然后使用find(-exec ... {} 獲得相同的性能優勢xargs,否則會提供):
find -name "*.txt" -exec sh -c '
for arg in "$@"; do echo "example_text" >>"$arg"; done
' _ {}
(在上述兩種情況下, , 的_替代品$0,所以后面的引數變成$1了 and later,因此在展開 時被迭代"$@")。
uj5u.com熱心網友回復:
正如許多人指出的那樣,xargs這是不合適的,所以你可以簡單地使用 find 和 pipe toread在一個回圈中輕松完成你想要的,如下所示。
find . -name "*.txt" | while read fname; do echo "example_text">>$fname; done
uj5u.com熱心網友回復:
如果使用 find,請使用-exec將找到的檔案作為引數傳遞給行內腳本:
find . -name '*.txt' -exec sh -c '
for file_name
do
printf "example_text\\n" >> "$file_name";
done
' _ {} \
uj5u.com熱心網友回復:
從 的角度來看bash,您的命令包含三個部分:
- 在管道字符 (
find -name "*txt")之前 - 在管道和重定向之間 (
xargs echo "example_text") - 重定向后 (
)
bash嘗試打開重定向后提供的輸出檔案,但由于您沒有提供任何內容,bash因此無法打開“無”并失敗。
要解決您的問題,您需要提供xargs一種方法來將您需要的行添加到檔案中(而不要求bash重定向 的輸出xargs)。一種可行的方法是啟動一個執行該操作的子shell:
find -name "*txt" | xargs -I{} bash -c 'echo "example_text" >> {}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/483594.html
