将一个命令的输出传递给另一个命令

将一个命令的输出传递给另一个命令

我正在尝试将一个命令的输出传递给另一个命令:

ls -lt *.txt | tail -n 3 | cat

我想列出所有.txt文件,获取最后 2 个文件,然后使用 显示其内容cat,但这是不正确的方式。我怎样才能实现这个目标?我提到https://unix.stackexchange.com/a/108797/431721并尝试使用cat $( ls -lt *.txt | tail -n 3),但不起作用。任何意见?

答案1

为了正确处理所有可能的文件名(包括带有换行符的文件名),以下命令将cat使用 shell 调用最近最少修改的两个文件,最后处理最旧的文件zsh

cat ./*.txt(.om[-2,-1])

以下是cat两个最近修改的文件,首先处理最近修改的文件:

cat ./*.txt(.om[1,2])

在这里,通配符模式(.om[1,2])之后./*.txt全局限定符.限定符中的 使模式仅匹配普通文件(而不是目录等)。om按修改时间戳对文件进行排序(将Om颠倒顺序)。仅挑选[1,2]出结果列表的前两个元素。这里的负索引将从列表末尾开始计数。

从shell 中,像任何其他实用程序一样bash使用:zsh

zsh -c 'cat ./*.txt(.om[-2,-1])'

zsh -c 'cat ./*.txt(.om[1,2])'

分别。

答案2

一次一步地完成它:

$ ls -lt *.txt
-rw-r--r-- 1 stew stew 18 Feb  5 19:53 file3.txt
-rw-r--r-- 1 stew stew 18 Feb  5 19:53 file2.txt
-rw-r--r-- 1 stew stew 18 Feb  5 19:53 file1.txt

我们有三个文件,但您只想要两个。让我们tail来吧:

$ ls -lt *.txt | tail -n 2
-rw-r--r-- 1 stew stew 18 Feb  5 19:53 file2.txt
-rw-r--r-- 1 stew stew 18 Feb  5 19:53 file1.txt

好的,这很好,但我们实际上只想要两个文件名。 ls -l不是正确的工具,我们可以使用ls

$ ls -t *.txt | tail -n 2
file2.txt
file1.txt

cat然后将该输出作为参数放入$()

$ cat $(ls -t *.txt | tail -n 2)
content of file 2
content of file 1

您询问如何使用别名ls -lthr-l效果并不好,因为它打印的不仅仅是文件名。 只有存在-h才有意义。-l这是一个例子ls -tr

$ alias lt='ls -tr'
$ cat $(lt *.txt | tail -n 2)
content of file 2
content of file 3

如果您有.bashrc喜欢的东西alias ls='ls -lthr',那么您可以使用command lsenv ls。如果您还想要其他东西来处理文件中的奇怪字符(例如换行符),请使用以下示例find

cat $(find . -name '*.txt' | tail -n 2)

但是,排序可能与您的解决方案不同,ls并且它还会搜索子目录。

答案3

只要你有 GNU coreutils ls:

eval "sorted=( $(ls -rt --quoting-style=shell-escape *.txt) )"
cat "${sorted[@]:0:3}"

这不是一个理想的解决方案,但它会创建一个数组,其中包含当前目录中的 txt 文件,按修改时间排序,然后对前 3 个进行排序。

答案4

您只需在一行中执行以下命令即可:

$ ls *.txt | tail -2 | xargs cat

解释:

创建三个测试文件:

tc@user1:~$ echo "first file reads 1" > file1.txt
tc@user1:~$ echo "second file reads 2" > file2.txt
tc@user1:~$ echo "third file reads 3" > file3.txt

验证文件已创建:

tc@user1:~$ ls -l
total 12
-rw-r--r--    1 tc       staff           19 Feb  5 18:58 file1.txt
-rw-r--r--    1 tc       staff           20 Feb  5 18:58 file2.txt
-rw-r--r--    1 tc       staff           19 Feb  5 18:58 file3.txt

列出所有文本文件,然后使用管道读取最后两个文件的内容:

tc@user1:~$ ls *.txt | tail -2 | xargs cat
second file reads 2
third file reads 3

相关内容