我正在尝试将一个命令的输出传递给另一个命令:
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 ls
或env 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