題 Xargs將輸入傳遞給包含管道的命令


作為了解如何使用管道操作綁定優先級的工具,我正在嘗試為每個目錄打印一個文件的路徑 - 對於每個目錄:

find $PWD -type d | xargs --delimiter "\n" -I% -n 1 (find % -maxdepth 1 | head -1)

我明白了 no matches found: (find % -maxdepth 1 | head -1)。沒有括號我會得到 xargs: find: terminated by signal 13 所以我很確定我們需要以某種方式使管道正確關聯。

如何將xargs輸入傳遞給包含管道的命令? (請不要告訴我使用 -exec,我想學習如何操縱其他問題的綁定優先級)。


2
2017-08-16 21:45


起源




答案:


在這裡你是xargs:

find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1'

但請記住:內部循環是 許多 快點!

time find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done >/dev/null                                                                                       
    0m09.62s real     0m01.67s user     0m02.36s system
time find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' >/dev/null                                                                                                   
    0m12.85s real     0m01.84s user     0m02.86s system

2
2017-08-16 22:32



有趣。儘管如此,我想學習操縱管道關聯性的正確方法(如果可能的話)。我認為用花括號創建一個子殼可以做到這一點,但顯然不是。 - Sridhar-Sarnobat
xargs沒有其他解決方案。看著: stackoverflow.com/questions/6958689/... - Ipor Sircer
哦,這就是為什麼你不喜歡xargs。或者至少,這就是為什麼你讓我變成了一個xargs仇恨者:)任何拋棄外殼力量的東西都是一個閃存般的解決方案。 - Sridhar-Sarnobat


我個人不喜歡xargs

find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done

0
2017-08-16 21:58



很高興知道這是另一種選擇。雖然我討厭循環;) - Sridhar-Sarnobat
你會 愛 循環很快! ; - > - Ipor Sircer
即使我是一名功能性編程活動家?在編寫java代碼時,我會不惜一切代價避免循環。但只要循環只做一件事然後它是可以接受的,雖然詳細:( - Sridhar-Sarnobat


這是最快的解決方案,一切都是內部的:

time find . -type d | while read dir;do for file in "$dir"/*;do if [ -f "$file" ]; then realpath $file;break;fi;done;done >/dev/null
    0m00.21s real     0m00.08s user     0m00.10s system

殼中無與倫比的速度。 (我說我不喜歡xargs)


0
2017-08-16 22:39