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

相关问题