第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

請(qǐng)問(wèn)如何循環(huán)查找返回的文件名?

請(qǐng)問(wèn)如何循環(huán)查找返回的文件名?

炎炎設(shè)計(jì) 2019-08-02 13:02:04
如何循環(huán)查找返回的文件名?x=$(find . -name "*.txt")echo $x如果我在Bashshell中運(yùn)行上面的代碼,我得到的是一個(gè)包含幾個(gè)文件名的字符串,該字符串由空白分隔,而不是一個(gè)列表。當(dāng)然,我可以用空白將它們分開(kāi),以獲得一個(gè)列表,但我確信有更好的方法。那么,循環(huán)遍歷find指揮部?
查看完整描述

3 回答

?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果你只是為了最正確的答案而來(lái),你可能想要我個(gè)人的偏好,find . -name '*.txt' -exec process {} \;(見(jiàn)這篇文章的底部)。如果你有時(shí)間的話,把剩下的部分讀一遍,看看幾種不同的方法,以及它們中大多數(shù)的問(wèn)題。


完整的答案是:

最好的方法取決于你想做什么,但這里有幾個(gè)選擇。只要子樹(shù)中沒(méi)有文件或文件夾的名稱中有空格,您就可以遍歷這些文件:

for i in $x; do # Not recommended, will break on whitespace
    process "$i"done

稍微好一點(diǎn),去掉臨時(shí)變量x:

for i in $(find -name \*.txt); do # Not recommended, will break on whitespace
    process "$i"done

它是你最好在可能的時(shí)候笑一笑??瞻妆kU(xiǎn)箱,用于當(dāng)前目錄中的文件:

for i in *.txt; do # Whitespace-safe but not recursive.
    process "$i"done

通過(guò)啟用globstar選項(xiàng),您可以在此目錄和所有子目錄中顯示所有匹配的文件:

# Make sure globstar is enabledshopt -s globstarfor i in **/*.txt; do # Whitespace-safe and recursive
    process "$i"done

在某些情況下,例如,如果文件名已經(jīng)在文件中,則可能需要使用read:

# IFS= makes sure it doesn't trim leading and trailing whitespace# -r prevents interpretation of \ escapes.while IFS= read -r line; do # Whitespace-safe EXCEPT newlines
    process "$line"done < filename

read可安全結(jié)合使用find通過(guò)適當(dāng)設(shè)置分隔符:

find . -name '*.txt' -print0 | 
    while IFS= read -r -d '' line; do 
        process $line    done

對(duì)于更復(fù)雜的搜索,您可能需要使用find,不管是用它-exec選項(xiàng)或有-print0 | xargs -0:

# execute `process` once for each filefind . -name \*.txt -exec process {} \;# execute `process` once with all the files as arguments*:find . -name \*.txt -exec process {} +# using xargs*find . -name \*.txt -print0 | xargs -0 process# using xargs with arguments after each filename (implies one run per filename)find . -name \*.txt -print0 | xargs -0 -I{} process {} argument

find還可以在運(yùn)行命令之前將CD光盤(pán)到每個(gè)文件的目錄中。-execdir而不是-exec,并且可以使用以下命令進(jìn)行交互(在運(yùn)行每個(gè)文件的命令之前提示符)-ok而不是-exec(或-okdir而不是-execdir).

*:技術(shù)上,兩者都是findxargs(默認(rèn)情況下)將在命令行中使用盡可能多的參數(shù)來(lái)運(yùn)行該命令,并盡可能多地運(yùn)行該命令以獲得所有文件。實(shí)際上,除非您有大量的文件,否則這并不重要,而且如果您超過(guò)了長(zhǎng)度,但是需要在同一個(gè)命令行中所有這些文件,你是索爾找個(gè)不同的方法。




查看完整回答
反對(duì) 回復(fù) 2019-08-03
?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

find . -name "*.txt"|while read fname; do
  echo "$fname"done

注:此方法bmarguies顯示的(第二個(gè))方法在文件/文件夾名稱中的空白中使用是安全的。

為了在所涵蓋的文件/文件夾名稱中有一些異國(guó)情調(diào)的換行符,您將不得不求助于-exec謂語(yǔ)find就像這樣:

find . -name '*.txt' -exec echo "{}" \;

這個(gè){}是已找到項(xiàng)的占位符,而\;用于終止-exec謂詞

為了完整起見(jiàn),讓我添加另一個(gè)變體-你必須喜歡*nix方式,因?yàn)樗鼈兊亩喙δ苄裕?/trans>

find . -name '*.txt' -print0|xargs -0 -n 1 echo

這將印刷品與\0據(jù)我所知,在任何文件系統(tǒng)中都不允許使用文件名或文件夾名中的字符,因此應(yīng)該涵蓋所有的基礎(chǔ)。xargs然后一個(gè)接一個(gè)地?fù)炱饋?lái).。




查看完整回答
反對(duì) 回復(fù) 2019-08-03
?
交互式愛(ài)情

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊

不管你做什么,不要使用for環(huán)路:

# Don't do thisfor file in $(find . -name "*.txt")do
    …code using "$file"done

三個(gè)原因:

  • 如果for循環(huán)甚至要啟動(dòng),則

    find

    必須完成。
  • 如果一個(gè)文件名中有任何空格(包括空格、制表符或換行符),那么它將被視為兩個(gè)單獨(dú)的名稱。
  • 盡管現(xiàn)在不太可能,但您可以溢出命令行緩沖區(qū)。假設(shè)您的命令行緩沖區(qū)包含32 KB,而您的

    for

    循環(huán)返回40 kb的文本。最后的8KB將從你的

    for

    循環(huán)你永遠(yuǎn)也不會(huì)知道。

始終使用while read建造:

find . -name "*.txt" -print0 | while read -d $'\0' filedo
    …code using "$file"done

循環(huán)將在find命令正在執(zhí)行。此外,即使返回帶有空格的文件名,該命令也能工作。并且,您不會(huì)溢出命令行緩沖區(qū)。

這個(gè)-print0將使用NULL作為文件分隔符,而不是換行符,-d $'\0'讀取時(shí)將使用NULL作為分隔符。




查看完整回答
反對(duì) 回復(fù) 2019-08-03
  • 3 回答
  • 0 關(guān)注
  • 493 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)