bash - 如何在脚本中对 find 命令的输出进行排序
问题描述
我有以下简单的脚本来查找在过去 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
命令添加排序?
解决方案
第一:双引号你的变量引用!使用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"
请注意,我在所有变量引用周围都加上了双引号,因为这几乎总是一个好主意。我还使用$( )
了反引号而不是反引号——它更易于阅读,并且避免了反引号所具有的一些解析异常。
无论如何,使用这种格式,您始终使用正确的换行符,因此管道sort
应该按预期工作。
顺便说一句,我还建议从大写变量名称切换到小写或混合大小写名称,因为有一堆全大写名称具有特殊含义,如果您不小心使用其中一个,可能会发生坏事。
推荐阅读
- docker - 使用 docker-compose 创建的容器已退出
- r - 如果有两个变量,如何编辑 facet_wrap/grid 的标签?
- java - 强制 Apache ActiveMQ 的 JMX 只能从 localhost 访问
- gpu - vulkan 在 lxc / lxd 容器中不可用,但 opengl 是
- c# - 列表中的最佳性能查找以供以后比较
- elasticsearch - 使用 discovery-ec2 设置 Elasticsearch 7 集群
- python - 如何在 Python 中使用子进程优雅地终止 OSX 应用程序
- linux - 找出 Docker 主机卷权限
- ios - 如何将 Vision 输出显示到 UI 中?
- python - 有没有办法使用 Selenium 禁用 chrome “同源”策略?