首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过命令将文件按反向时间顺序列出,并将它们作为参数传递给另一个命令?

如何通过命令将文件按反向时间顺序列出,并将它们作为参数传递给另一个命令?
EN

Unix & Linux用户
提问于 2019-04-21 18:44:52
回答 3查看 3.9K关注 0票数 6

我有一个程序,它在一个命令行中将一些文件作为参数。我想用按反向顺序列出的目录中的所有文件调用它。

例如:

我在目录中有以下文件按反向时间顺序排列

代码语言:javascript
复制
$ ls -tr
 Introduction.pdf  'Object-Oriented Data Model.pdf' 

我可以直接运行我的程序,

代码语言:javascript
复制
myprogram Introduction.pdf  'Object-Oriented Data Model.pdf' 

但是我想通过另一个命令来执行文件列表。这将无法工作,因为一个文件的名称中有空格:

代码语言:javascript
复制
myprogram $(ls -tr)

我记得解析ls输出不是一个好做法。我不确定find是否能帮上忙。

那我能做什么呢?

谢谢。

EN

回答 3

Unix & Linux用户

发布于 2019-04-21 20:00:03

如果您有合理的最新版本的GNU实用程序,您可以让它们处理以空结尾的数据。这允许构造不受数据本身中空白或换行符影响的管道。

我的测试工具是一个名为/tmp/args的快速脚本:

代码语言:javascript
复制
#!/bin/bash
echo "This is args with $# value(s)"
for f in "$@"; do echo "> $f <"; done

这是如何在命令行上按上次修改的文件时间排序的一系列文件名的方式:

代码语言:javascript
复制
find -type f -printf "%T@ %p\0" | sort -zn | sed -z 's/^[0-9.]* //' | xargs -0 /tmp/args

find命令以上次修改的日期/时间的小数秒作为每个文件/路径名称的前缀。这由sort处理,从最低(最老)到最高(最新)。sed去掉了我们刚才用来排序的前导数字,并将得到的文件名集传递给xargs。如果您希望从文件名中省略前面的%p,则用%P替换./

示例数据

代码语言:javascript
复制
# "c d" contains a space; "e f" contains a newline; "h" has leading whitespace
touch a 'e
f' g ' h ' 'c d' b

实例结果

代码语言:javascript
复制
This is args with 6 value(s)
> ./a <
> ./e
f <
> ./g <
> ./ h  <
> ./c d <
> ./b <
票数 7
EN

Unix & Linux用户

发布于 2019-04-22 00:55:45

巴什还不容易按修改时间对文件进行排序,这是必须的基于zsh的答案。您不必切换到zsh作为登录shell才能使用它的功能。

在这里,我设置了一个包装器函数,它需要一个或两个参数;第一个参数是要执行的程序(例如myprogram);第二个参数是包含要传递给程序的文件的目录。如果不指定第二个参数,则默认为当前目录。

代码语言:javascript
复制
zeio() {
  # Zsh-based Execute with files In Order
  [ -d "${2:-.}" ] || return
  zsh -c "$1 \"${2:-.}\"/*(.om)"
}

当然,随便你怎么说。在快速检查第二个参数(同样,默认为当前目录. )之后,我们使用一个双引号字符串调用zsh,该字符串包含程序和一些初始参数(参数#1)和目录(参数#2) --默认为. --带有一个通配符/ glob展开,该扩展在尾随括号中有两个“全球限定词”

  1. . --必须是常规文件(不是目录或符号链接等等)
  2. om -按修改时间对结果列表进行排序- order (排序),最近一次

正是om全球限定符完成了这里所有的真正工作。

下面是一些示例运行;myprog是一个简单的shell脚本,用于演示它接收到的参数,以便:

代码语言:javascript
复制
#!/bin/sh
for arg do
  printf 'Arg: ->%s<-\n' "$arg"
done

go.sh是我保存函数的文件。目录结构的其余部分是:

代码语言:javascript
复制
$ tree .
.
├── dir1
│   ├── 203142
│   ├── 203143
│   └── 203144
├── dir3
│   ├── first\012filename
│   ├── this is 3rd
│   └── this is second
├── dir two
│   ├── 203225
│   ├── 203226
│   └── 203227
├── go.sh
└── myprog

..。在其中,我按照列出的顺序在每个子目录中创建了三个文件集;在执行函数时,我希望看到它们的顺序相同。dir3下的第一个文件名中有一个换行符,由tree\012表示。研究结果如下:

演示默认到当前目录的行为:

代码语言:javascript
复制
$ zeio ./myprog
Arg: ->./myprog<-
Arg: ->./go.sh<-

普通文件名演示

代码语言:javascript
复制
$ zeio ./myprog dir1
Arg: ->dir1/203142<-
Arg: ->dir1/203143<-
Arg: ->dir1/203144<-

目录中有一个空格--

代码语言:javascript
复制
$ zeio ./myprog "dir two"
Arg: ->dir two/203225<-
Arg: ->dir two/203226<-
Arg: ->dir two/203227<-

文件名中有空格,

代码语言:javascript
复制
$ zeio ./myprog dir3
Arg: ->dir3/first
filename<-
Arg: ->dir3/this is second<-
Arg: ->dir3/this is 3rd<-
票数 4
EN

Unix & Linux用户

发布于 2019-04-21 19:01:02

代码语言:javascript
复制
(IFS=假设文件名不包含换行符。示例:% touch 'a   b'
% touch 'c d'
% touch '*'
% (IFS=不支持字符串的标准shell的变体:(IFS='
' ; set -f; your_program $(ls -tr))简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是this_wrapper your_program *。#! /usr/bin/python
import os
import sys

sys.argv[2:] = sorted(sys.argv[2:], key=os.path.getmtime)
os.execvp(sys.argv[1], sys.argv[1:])\n'; set -f; your_program $(ls -tr))假设文件名不包含换行符。示例:A1不支持D2字符串的标准shell的变体:A3简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4。A5\n'; set -f; printf '%s\n' $(ls -tr))
e    f
a   b
c d
*

不支持D2字符串的标准shell的变体:

A3

简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4

A5\n'; set -f; your_program $(ls -tr))

假设文件名不包含换行符。

示例:

A1

不支持D2字符串的标准shell的变体:

A3

简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4

A5...'字符串的标准shell的变体:A3

简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4

A5\n'; set -f; your_program $(ls -tr))

假设文件名不包含换行符。

示例:

A1

不支持D2字符串的标准shell的变体:

A3

简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4

A5\n'; set -f; printf '%s\n' $(ls -tr)) e f a b c d *

不支持D2字符串的标准shell的变体:

A3

简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4

A5\n'; set -f; your_program $(ls -tr))

假设文件名不包含换行符。

示例:

A1

不支持D2字符串的标准shell的变体:

A3

简单的python包装器,它甚至可以使用包含新行的文件名。用法可以是D4

A5

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/513695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档