2016-02-04 88 views
1

有了:什麼是最快的方式來查找和刪除文件?

Find="$(find/-name "*.txt")" 
du -hc "$Find" | tail -n1 
echo "$Find" | xargs rm -r 

如果找到該文件foo bar.txt,它不會與杜計或刪除該文件。什麼是擺脫空間的最佳方式?

+0

將'IFS'設置爲換行符,以便變量擴展中的空格不會用作單詞分隔符。 – Barmar

+3

'find -delete'是最快的; [看到這個](http://stackoverflow.com/questions/33488712/delete-nested-hidden-files-with-egrep-and-xargs/33488763#33488763)。 – Kenney

+0

@Cyrus:感謝您清理其他評論,但如果您想保留shellcheck.net評論,請_recreate it_說明_it不再直接適用_,並且您只是簡單地推薦shellcheck.net作爲一個有用的資源。 – mklement0

回答

2

如果沒有你的文件名可以有嵌入式換行(這將是非常不尋常的),你可以使用以下命令:

注:爲了防止文件被意外刪除,同時與命令實驗,我已將輸入目錄替換爲/。 (在問題中使用)與/foo

# Read all filenames into a Bash array; embedded spaces in 
# filenames are handled correctly. 
IFS=$'\n' read -d '' -ra files < <(find /foo -name "*.txt") 

# Run the `du` command: 
du -hc "${files[@]}" | tail -1 

# Delete the files. 
rm -r "${files[@]}" 

需要注意的是,如果你沒有必要提前收集所有的文件名,不介意運行find兩次,你可以使用一個find命令爲每個任務(除管道到這也是最強大的選項(唯一的警告是,如果你有太多的文件,他們不適合在一個命令行上,du可能會被調用多個次)。

# The `du` command 
find /foo -name "*.txt" -exec du -hc {} + | tail -n1 

# Deletion. 
# Note that both GNU and BSD `find` support the `-delete` primary, 
# which supports deleting both files and directories. 
# However, `-delete` is not POSIX-compliant (a POSIX-compliant alternative is to 
# use `-exec rm -r {} +`). 
find /foo -name "*.txt" -delete 

使用+終止傳遞給-exec命令是至關重要的,因爲它指示 find傳遞儘可能多的匹配,而將適合的單個命令行到目標命令上;通常但不一定,這會導致調用單個;有效-exec ... +就像內置xargs一樣,除了參數中嵌入的空格是而不是的一個問題。

換句話說:-exec ... +不僅比管道配管xargs更穩健,而且 - 由於不需要管道和其他公用設施 - 也更高效。

+0

我同意嵌入換行符很少見,但面對它們時脆弱的方法是什麼?目標是否與POSIX兼容? –

+0

@CharlesDuffy:獨立的'find'命令可以避免嵌入的換行問題,其方式可以在您對問題的有用評論中提出(儘管無法保證'du'的_single_調用)。否則,它是便利/效率和涵蓋所有邊緣案例之間的折衷。你能想到一個完全可靠的方法來收集所有文件名,沒有循環,沒有涉及臨時文件? – mklement0

0

也許find/-name '*.txt' -exec du -hc {} \;更像是你要找的東西?

但是,這樣做的你做,你錯過了你的通話引號du,並不必要使用xargs時將無法正常工作......你似乎迷戀echo,誰是不是你的朋友。

由於\0沒有在文件名中不允許,你可以安全地從find使用其-print0選項收集結果:

date > /private/var/mobile/Documents/Local\ Cookies/Clean 

find . -print0 | while IFS='' read -r -d '' file 
do 
     du -hc "$file" | tail -n 1 
     rm "$file" 
done 

更正應該在MacOS和Linux現在的工作。

+0

要使'du -hc'按預期工作(報告_total_大小),您必須將_all_文件名傳遞給它;因此:'-exec du -hc {} +'。 – mklement0

+0

您的循環解決方案除了效率低下之外,還存在相同的問題:在_individual_文件上調用du -hc並不是OP所期望的。另外,你可能忘了在'rm'命令之前刪除'xargs'。 – mklement0

+0

對,剪切粘貼錯誤。而且......是的,我可以用任何方式來解釋這個意圖,就像'du'一樣。 'rm -r'讓我感到困惑,除非有人擁有名爲* .txt的目錄? – BRFennPocock

相關問題