我写了一个别名来向我展示10个最大的文件和10个最大的目录,所以我试图隐藏"du无法访问"和"没有这样的文件或目录"错误,但没有成功.
在我写的别名下面:
alias big="echo 'Big Files:';find . -type f -print0 | xargs -0 du -h | sort -hr | head -10 2>/dev/null;echo 'Big Directories:';du -sh * | sort -hr | head -n10 2>/dev/null"
感谢帮助
第一:使用函数代替.这种应用程序完全是别名的错误用例.一个函数可以让你在多行上写你的逻辑; 可以在执行时具有条件逻辑(例如,您可以查看您的函数是否被赋予参数,并且如果它们存在则表现不同); 并且可以使用相同的语法big
调用(在任何一种情况下都只是调用).
第二:重定向stderr以获取整个事物,而不仅仅是最后一段.
big() { { # <-- open a block we can redirect echo 'Big Files:' find . -type f -exec du -h -- '{}' + | sort -hr | head -10 echo 'Big Directories:' du -sh -- */ | sort -hr | head -n10 } 2>/dev/null # <-- close, and redirect, that block }
你也可以在继续使用别名的同时做同样的事情(但是,你不应该这样做):
alias big='{ echo "Big Files:";find . -type f -print0 | xargs -0 du -h | sort -hr | head -10;echo "Big Directories:";du -sh * | sort -hr | head -n10; } 2>/dev/null'
在这里,包装整个代码{ }
允许我们在整个块上执行单个重定向,而不需要牺牲子shell(如通过包装代码而创建的)( )
.
其他说明:
find -exec ... {} +
是POSIX指定的,并且具有与产生相同的效率增益find ... -print0 | xargs -0
(在产生不再需要的子进程的实例方面),并且实际上稍微更有效,因为它避免了对外部xargs
进程的需要.
使用*/
在"大目录"段告诉水珠只扩大到目录名.使用--
参数优先级告诉我du
将过去那一点给出的所有参数解释为文件或目录名称,即使您的名称以a开头也是如此-
.
对于尝试在MacOS上测试此答案的人,请注意它取决于GNU排序.我个人已gsort
通过macports(port install coreutils
)安装,因此用于sort() { gsort "$@"; }
在测试时包装sort命令.