如何在脚本中对find命令的输出进行排序

时间:2018-11-14 01:46:47

标签: bash

我有以下简单的脚本来查找最近N天添加的所有目录(深度为2)...

#!/bin/bash
DAYS_PRIOR=180
DIR='/mydir'
FILES=`find $DIR -mindepth 2 -maxdepth 2 -type d -mtime -$DAYS_PRIOR -printf '%f\\\n'`
echo
echo "Files added in the last $DAYS_PRIOR days:"
echo
echo -e $FILES
echo

要使其添加换行符,我必须两次转义printf并使用echo -e。这对我来说似乎很奇怪,但这是我唯一可以在输出的每行打印一个目录的方法。

到目前为止,一切正常,我得到了预期的目录列表。现在,我想按字母顺序对列表进行排序。我尝试将find命令中的printf更改为...

FILES=`find <xxx> -printf '%f\\\n' | sort`

但是,这不会对目录名称进行排序。根据其他帖子,我尝试了以下操作。

FILES=`find <xxx> -printf %f\\\n | sort -t '\0' | awk -F '\0' '{print $0; print "\\\n"}'`

这非常接近,但是在每一行的开头都留出了多余的空间,而且看上去很尴尬。

是否有一种简单的方法可以向原始find命令添加排序?

1 个答案:

答案 0 :(得分:1)

首先:将变量引用双引号!当您使用echo -e $FILES时,变量FILE的值将根据空格(空格,制表符和换行符)分成“单词”,然后echo将这些单词与它们之间的空间。这具有将换行符转换为空格的作用。为了最后使用换行符,您必须使用\n而不是真正的换行符,然后使用echo -e进行转换。只需使用真实的换行符,然后在变量引用周围加上双引号即可避免所有此类混乱:

FILES=$(find "$DIR" -mindepth 2 -maxdepth 2 -type d -mtime "-$DAYS_PRIOR" -printf '%f\n')
# ...
echo "$FILES"

请注意,我在 all 变量引用两边加上了双引号,因为这几乎总是一个好主意。我还使用了$( )而不是反引号-它更易于阅读,并且避免了反引号具有的某些解析奇异之处。

无论如何,使用这种格式,您在整个过程中都使用适当的换行符,因此通过sort进行管道传递应该可以正常工作。

顺便说一句,我还建议从大写变量名切换为小写或大小写混合名,因为有一堆具有特殊含义的全大写字母名称,如果您不小心使用其中之一,则坏事会发生。