Ls

如何使“ls -1”結合xargs在引號中列印出來?

  • December 19, 2021

我執行這樣的ls命令來列出多個目錄。請注意文件夾中的空白區域X y

ls -1d 2021*/"X y"/foobar

輸出是

'20211121-161518-801/X y/foobar'
'20211128-151513-585/X y/foobar'
'20211130-170001-724/X y/foobar'

看起來 ls 在這裡仍然使用引號。但是當我將此輸出與xargs引號結合使用時,接縫會失去

ls: Zugriff auf '20211121-161518-801/X' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'y/foobar' nicht möglich: Datei oder Verzeichnis nicht gefunden

xargs 命令是這樣的

ls -1d 2021*/"X y"/foobar | xargs ls

最後我將使用 axargs rm -rfxargs ls只是一個測試。

雖然 Stéphane Chazelas 總體上給了你很好的和深入了解“現代”的內容ls,但並非所有ls的 es 都是平等的。即使新的 GNUls會出現--zero,也需要幾十年的時間才能滲透到所有地方,而且這仍然不適用於所有人,尤其是非基於 GNU 的系統。

普遍的共識ls是,它是為人類消費而設計的,不應該真正被信任用於其他任何事情。

儘管這是老管理員之間相當普遍的知識,但由於許多可以理解(和其他莫名其妙)的原因,新手和新手管理員仍然完全被ls. 隨著 Linux 超越利基市場並進入越來越多的主流和國有化環境,這種ls熱愛正成為嚴重的問題(正如您自己的情況所證明的那樣)。這也是為什麼 GNUls正在“快速”增長ls幾十年來任何人都應該擁有的選項的原因。

但是,如果您現在真的想可靠、安全地解決這個問題,那麼適合這項工作的正確工具是find命令:既可以用作零分隔列表生成器,也可以用作直接命令執行器。

find用作零分隔列表生成器:

find topdir -mindepth 1 [-maxdepth 2] -type d -print0 | xargs -0 -I@ stat @

用作find直接執行者:

find topdir -mindepth 1 [-maxdepth 2] -type d -exec stat '{}' \;

使用-mindpeth/-maxdepth您可以控制find將下降的深度,通過-type您控制它將處理哪些對象。您還可以匹配對象名稱甚至對象路徑。因為find預設情況下不會以任何“智能”方式破壞或轉義對象名稱,所以您可以通過管道(生成器)或作為 argv 向量(執行器)的一部分,將這些 anmes 傳遞給原始而無需擔心。

請記住,當以這種方式通過管道改組列表時,-print0必須始終使用,以便名稱以零分隔,其他字元(如空格和換行符)可以直接表示,不要混淆讀者。

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