Linux

無輸出:busybox find 。-exec sh -c ’ 讀取連結 -f ‘$1’ |尾 -n +2 ’ sh {} ;

  • September 12, 2021

我只能訪問 Busybox 1.31.1

我最初想刪除輸出的目前工作目錄(單點)。

例子:

/prueba$ ls
uno dos tres

當我:

$ busybox find .
.
./uno
./dos
./tres

這很容易通過以下任一方式完成:

busybox find . -not -path .
busybox find . -mindepth 1

現在,我之前嘗試的是:

busybox find . -exec sh -c ' readlink -f "$1" | tail -n +2 ' sh {} \;

什麼都不列印。如果啟動詳細輸出:

==> standard input <==
==> standard input <==
==> standard input <==
==> standard input <==
==> standard input <==

如果行地址為 1,則輸出完全不同:

busybox find . -exec sh -c ' readlink -f "$1" | tail -n +1 ' sh {} \;
==> standard input <==
/tmp/prueba
==> standard input <==
/tmp/prueba/tres
==> standard input <==
/tmp/prueba/dos
==> standard input <==
/tmp/prueba/uno

這是怎麼回事?

-exec some command with parms {} \;

為每個文件呼叫一次命令。在您的情況下,readlink輸出一行輸出,然後您tail -n +2剝離第一行,讓您一無所有。如果您使用tail -n +1這只是一種冗長的說法cat,將輸入複製到輸出。

如果你重寫它,那麼它就在這樣tail -n +2的隱式循環之外

busybox find . -exec sh -c ' readlink -f "$1" ' sh {} \; | tail -n +2

你會得到你預期的結果。

您可以通過批處理命令執行來提高命令的效率。

busybox find . -exec readlink -f -- {} + | tail -n +2

這需要您要執行的命令來獲取多個文件。而+不是\;make find 執行命令的次數要少得多,因為它僅在具有完整的文件名緩衝區而不是每個文件一次時才執行命令。顯然我也刪除了不需要sh的。

引用自:https://unix.stackexchange.com/questions/668116