在bash

时间:2016-09-27 22:04:39

标签: bash

我有以下bash搜索特定目录并返回该目录中最早的文件夹。 bash如果每个文件夹中没有子文件夹,则效果很好。如果有返回而不是主文件夹。我不确定为什么会发生这种情况或如何解决它。谢谢你:)。

例如,

/home/cmccabe/Desktop/NGS/test是搜索到的目录,其中有两个文件夹R_1 and R_2

输出

 The earliest folder is: R_1

但是,如果/ home / cmccabe / Desktop / NGS / test has R_1及其中的testfolder and R_2和testfolder2在其中

输出

The earliest folder is: testfolder

cd /home/cmccabe/Desktop/NGS/test
folder=$(ls -u *"R_"* | head -n 1) # earliest folder
echo "The earliest folder is: $folder"

2 个答案:

答案 0 :(得分:1)

你应该阅读关于ls的信息,-u选项不会做你认为它做的事情。以下是相关选项:

  • -u - 告诉ls按时间排序时使用上次访问时间而不是上次修改时间。所以它本身什么都不做,应该用-t
  • 来调用
  • -t - 按时间(修改或访问或其他)排序,最新的
  • -r - 反转输出顺序
  • -d - 不要递归搜索目录

所以你真正需要的是:

$ ls -trd  

或者:

$ ls -utrd

答案 1 :(得分:1)

ls是这项工作的错误工具:它的输出是为人而不是脚本构建的,并且在存在非打印字符时通常会令人惊讶。

假设你有GNU findsort,以下内容适用于所有可能的文件名,包括带有文字换行符的文件名:

dir=/home/cmccabe/Desktop/NGS/test # for my testing, it's "."
{
  read -r -d $'\t' time && read -r -d '' filename
} < <(find "$dir" -maxdepth 1 -mindepth 1 -printf '%T+\t%P\0' | sort -z -r )

...此后:

echo "The oldest file is $filename, with an mtime of $time"

有关可移植地查找目录中最新或最旧文件的更大讨论,包括需要GNU工具的选项,请参阅BashFAQ #99