如何通过终端获取最新文件的名称?

时间:2010-05-15 00:58:33

标签: shell command-line keyboard-maestro

我正在尝试为OS X创建Keyboard Maestro的宏,执行以下操作:

  1. 根据创建的日期获取磁盘上目录中最新文件的名称;
  2. 粘贴文本“最新文件:”以及最新文件的名称。
  3. 其中一个选项是“执行一个shell脚本”,所以我认为这样做是为了1.在谷歌搜索了一下后我想出了这个:

    cd /path/to/directory/
    ls -t | head -n1

    将其排序,然后返回第一个文件名。但是,它似乎也包括一个我不想要的换行符。至于2:我可以在应用程序中输出带有不同操作的文本“最新文件:”,并将文件名粘贴到其后面。但我想知道你是否不能返回“随机文本”+ ls命令的结果。

    所以我的问题是:我是否只能使用ls命令执行此操作?如何在没有任何换行符或返回的情况下获取 最新文件的名称?

6 个答案:

答案 0 :(得分:10)

由于你已经在使用管道,只需在那里再扔一个:

ls -t | head -n1 |awk '{printf("newest file: %s",$0)}'

(请注意,“printf”末尾不包含'\ n';摆脱了换行符)

编辑:

Arkku建议在第一行之后退出awk,它看起来像是:

ls -t | awk '{printf("newest file: %s",$0);exit}'

答案 1 :(得分:4)

cd /path/to/directory/
echo -n "random text goes here" $(ls -t | head -n1)

如果需要,可以用相同的方式在末尾添加更多文字。

答案 2 :(得分:2)

你可以在bash中用这样的单个语句来做到这一点:

echo -n "newest file: $(ls -t |head -n1)"

您也可以在没有echo的情况下移除该换行符:

ls -t |head -n1 |tr -d '\n'

确保ls不向非tty流输出颜色(即按ls --color=neverls --color=auto指定颜色或根本不指定颜色。)

ls解决方案将输出按修改时间排序的任何类型的文件。如果您只想要常规文件或者您不想要目录,那么您可以使用findxargs

echo -n "newest file: $(find . -maxdepth 1 -type f -print0 |xargs -0 ls -t)"

答案 3 :(得分:2)

使用ls的输出是不好的做法。

find -type f -printf '%T+ %p\n' | sort -r | head -n 1

答案 4 :(得分:-1)

您不能只使用ls。但是,由于echo通常内置在shell中,因此它不会在脚本中添加任何开销。为了得到文件的名称,我建议:

echo -n "newest: $(ls -t1 | head -n1)"

如果出于某种原因,你真的想要消除head,那么我想你可以选择以下内容:

ls -t1 | ( read n; echo -n "newest: $n")

read内置于shell中,head不是。)

请注意,这些解决方案不会递归到子目录中,因为问题中未指定。实际上,子目录可以打印为最新的“文件”。

答案 5 :(得分:-1)

因为当我搜索“在mac shell上找到最新的文件”时首先出现,然后我想我会发帖给别人帮忙......

如果你试图在该目录中找到该文件,那么ls是好的,但我发现find工作得很好,你可能会在这个过程中学到一些新知识。然而,我必须在我的mac上找到GNU find才能使用上面发布的diimdeep代码行。

如果您运行Homebrew,如果您在终端上花费任何时间,或者可能是其中一种替代方案,那么您应该这样做。 你可以运行“brew install findutils” 一旦完成,上面的代码就会像这样......

sudo /usr/local/opt/findutils/bin/gfind -type f -printf '%T+ %p\n' | sort -r | head -n 1

如果您想要更多,只需将最后一位更改为10即可。如果你需要指定它,gfine将采取一个路径。我通常cd进入我想要开始的文件夹。查找是自动递归的。