使用應用程序打開文件列表的程序替換
我希望使用程序替換將文件列表(例如,由
ls
或生成find
)指向特定應用程序以打開/查看。雖然管道這樣的列表xargs
適用於腳本或二進製文件,但如果對xargs
像是 shell 別名,則此操作將失敗,如本站點上的其他問題中所述。[我想到的特定應用是feh
]鑑於
xargs
vis-a-vis bash 別名的這種限制,我改為嘗試以[script/binary/alias] <(find . -iname '*')
. 如果文件列表被定向到某些 shell 命令,例如cat
(或者less
,如果輸入重定向,<
,被添加到程序替換語句之前),則此構造會產生所需的效果;但是,如果輸入(文件的路徑列表)被定向到應用程序(例如 , )以進行打開/查看,則顯著feh
失敗gimp
。伴隨此失敗的錯誤,在特定情況下feh
是程序替換語句的接收者,是“feh: No loadable images specified.
” 將輸入重定向運算符添加到程序替換語句不會緩解問題(與其他命令不同,例如less
).因此,我的問題涉及是否可以將程序替換用於所述目的(即打開文件列表),如果可以,合適的語法可能是什麼。與 bash 別名兼容的特定要求(在
~/.bash_aliases
或類似的配置文件中指定)。
如果命令接受多個文件作為參數(而不是通過管道讀取的內容),簡單的命令替換應該可以工作:
[script/binary/alias] $(find .)
或者,如果命令一次只接受一個文件,則 for 循環應該可以解決問題:
for file in $(find .); do [script/binary/alias] "$file"; done
在這兩種情況下,包含空格、製表符、換行符、萬用字元的文件名都會導致問題;一個 while/read 循環處理這個:
find . | while IFS= read -r file; do [script/binary/alias] "$file"; done
包含換行符的文件名仍然會導致問題;
find
的 0 分隔輸出將解決這些問題(這裡假設bash
,zsh
,ksh
):find . -print0 | while IFS= read -rd '' file; do [script/binary/alias] "$file"; done
在所有這些範例中,
find . -type f
如果您只想處理正常文件,可能更合適。