3 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個贊
Greg的BashFAQ無恥地偷走了:
unset a iwhile IFS= read -r -d $'\0' file; do a[i++]="$file" # or however you want to process each filedone < <(find /tmp -type f -print0)
請注意,此處使用的重定向構(gòu)造(cmd1 < <(cmd2)
)與更常用的管道(cmd2 | cmd1
)相似但不完全相同- 如果命令是shell內(nèi)置的(例如while
),管道版本在子shell中執(zhí)行它們,以及它們設(shè)置的任何變量(例如陣列a
)在退出時丟失。 cmd1 < <(cmd2)
只在子shell中運(yùn)行cmd2,因此數(shù)組將超過其構(gòu)造。警告:這種重定向形式僅在bash中可用,在sh仿真模式下甚至不是bash; 你必須用你的腳本開始#!/bin/bash
。
此外,因?yàn)槲募幚聿襟E(在這種情況下,只是a[i++]="$file"
,但你可能想在循環(huán)中直接做一些更好的事情)將其輸入重定向,它不能使用任何可能從stdin讀取的命令。為了避免這種限制,我傾向于使用:
unset a iwhile IFS= read -r -u3 -d $'\0' file; do a[i++]="$file" # or however you want to process each filedone 3< <(find /tmp -type f -print0)
...通過單元3傳遞文件列表,而不是stdin。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個贊
也許你正在尋找xargs:
find . -print0 | xargs -r0 do_something_useful
選項(xiàng)-L 1對你也很有用,這使得xargs exec do_something_useful只有1個文件參數(shù)。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個贊
主要問題是,分隔符NUL(\ 0)在這里沒用,因?yàn)椴豢赡転镮FS分配NUL值。因此,作為優(yōu)秀的程序員,我們需要注意的是,我們程序的輸入是它能夠處理的。
首先,我們創(chuàng)建一個小程序,為我們完成這一部分:
#!/bin/bashprintf "%s" "$@" | base64
...并將其命名為base64str(不要忘記chmod + x)
其次,我們現(xiàn)在可以使用一個簡單而直接的for循環(huán):
for i in `find -type f -exec base64str '{}' \;`do file="`echo -n "$i" | base64 -d`" # do something with filedone
所以訣竅是,base64-string沒有任何跡象會導(dǎo)致bash出現(xiàn)問題 - 當(dāng)然xxd或類似的東西也可以完成這項(xiàng)工作。
添加回答
舉報(bào)