我有一个程序,它在一个命令行中将一些文件作为参数。我想用按反向顺序列出的目录中的所有文件调用它。
例如:
我在目录中有以下文件按反向时间顺序排列
$ ls -tr
Introduction.pdf 'Object-Oriented Data Model.pdf' 我可以直接运行我的程序,
myprogram Introduction.pdf 'Object-Oriented Data Model.pdf' 但是我想通过另一个命令来执行文件列表。这将无法工作,因为一个文件的名称中有空格:
myprogram $(ls -tr)我记得解析ls输出不是一个好做法。我不确定find是否能帮上忙。
那我能做什么呢?
谢谢。
发布于 2019-04-21 20:00:03
如果您有合理的最新版本的GNU实用程序,您可以让它们处理以空结尾的数据。这允许构造不受数据本身中空白或换行符影响的管道。
我的测试工具是一个名为/tmp/args的快速脚本:
#!/bin/bash
echo "This is args with $# value(s)"
for f in "$@"; do echo "> $f <"; done这是如何在命令行上按上次修改的文件时间排序的一系列文件名的方式:
find -type f -printf "%T@ %p\0" | sort -zn | sed -z 's/^[0-9.]* //' | xargs -0 /tmp/argsfind命令以上次修改的日期/时间的小数秒作为每个文件/路径名称的前缀。这由sort处理,从最低(最老)到最高(最新)。sed去掉了我们刚才用来排序的前导数字,并将得到的文件名集传递给xargs。如果您希望从文件名中省略前面的%p,则用%P替换./。
示例数据
# "c d" contains a space; "e f" contains a newline; "h" has leading whitespace
touch a 'e
f' g ' h ' 'c d' b实例结果
This is args with 6 value(s)
> ./a <
> ./e
f <
> ./g <
> ./ h <
> ./c d <
> ./b <发布于 2019-04-22 00:55:45
巴什还不容易按修改时间对文件进行排序,这是必须的基于zsh的答案。您不必切换到zsh作为登录shell才能使用它的功能。
在这里,我设置了一个包装器函数,它需要一个或两个参数;第一个参数是要执行的程序(例如myprogram);第二个参数是包含要传递给程序的文件的目录。如果不指定第二个参数,则默认为当前目录。
zeio() {
# Zsh-based Execute with files In Order
[ -d "${2:-.}" ] || return
zsh -c "$1 \"${2:-.}\"/*(.om)"
}当然,随便你怎么说。在快速检查第二个参数(同样,默认为当前目录. )之后,我们使用一个双引号字符串调用zsh,该字符串包含程序和一些初始参数(参数#1)和目录(参数#2) --默认为. --带有一个通配符/ glob展开,该扩展在尾随括号中有两个“全球限定词”:
. --必须是常规文件(不是目录或符号链接等等)om -按修改时间对结果列表进行排序- order (排序),最近一次正是om全球限定符完成了这里所有的真正工作。
下面是一些示例运行;myprog是一个简单的shell脚本,用于演示它接收到的参数,以便:
#!/bin/sh
for arg do
printf 'Arg: ->%s<-\n' "$arg"
donego.sh是我保存函数的文件。目录结构的其余部分是:
$ 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表示。研究结果如下:
$ zeio ./myprog
Arg: ->./myprog<-
Arg: ->./go.sh<-$ zeio ./myprog dir1
Arg: ->dir1/203142<-
Arg: ->dir1/203143<-
Arg: ->dir1/203144<-$ zeio ./myprog "dir two"
Arg: ->dir two/203225<-
Arg: ->dir two/203226<-
Arg: ->dir two/203227<-$ zeio ./myprog dir3
Arg: ->dir3/first
filename<-
Arg: ->dir3/this is second<-
Arg: ->dir3/this is 3rd<-发布于 2019-04-21 19:01:02
(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
https://unix.stackexchange.com/questions/513695
复制相似问题