代码之家  ›  专栏  ›  技术社区  ›  HeretoLearn

ksh中的Linux“for”构造

ksh
  •  0
  • HeretoLearn  · 技术社区  · 16 年前

    我通常使用ksh中的for构造来快速迭代文件列表,对其执行一些操作。在这种情况下似乎不起作用:

    The file info looks like: 
    $ ls -l tmp.*  
    rw------- 1 op general 375 Jul 25 04:09 tmp.zzyhsg4  
    ...  
    so on. Basically a lot of tmp.* files.    
    
    Now when I try  
    $ ls -lS | grep 'Jul 25' | grep 'tmp.*' | cut -d' ' -f9 | more  
    tmp.zzyhsg4  
    ..  
    

    但是当我尝试下面的

    $ for i in `ls -lS | grep 'Jul 25' | grep 'tmp.*' | cut -d' ' -f9`
    >do  
    >echo $i  
    >done  
    

    这不会打印所有以tmp.*开头的文件的名称,这些文件是7月25日创建的,按大小排序。它打印大小列。有趣的是,如果我将f10替换为f6,它将正确打印月份列。f9后开始破裂。

    有什么想法吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Gilles 'SO- stop being evil'    16 年前

    我无法准确地再现您所描述的内容,但我有一些建议,可以编写更可靠的命令。

    cut -d' ' 按空格分隔字段。如果一行中有两个空格,则它们之间有一个空字段。所以如果你试着 Aug 1 Jul 25 ,文件名列将移位1。如果您尝试使用6个月以上的文件,则(5个字符)时间将替换为后跟4位年份的空格。另外,根据您的版本 ls 不显示 group 长征 ? . 总之,您不能解析 ls -l 通过计算空格,你甚至不能解析 长征-长征 通过计算空格分隔的字段。只是 .

    find . 既然您提到了Linux,我就要提到使用gnufind(您在Linux上获得的版本)的选项,而不是其他unix。

    让我们从简单的开始:列出调用 tmp.* 在当前目录中。

    find . -name 'tmp.*'
    

    find . -name 'tmp.*' -daystart -mtime 7
    

    这东西很易碎,因为明天就坏了。通常指定精确日期的方法是创建日期在允许的最早和最晚时间的文件,并告诉 找到 只返回日期介于两者之间的文件。

    touch -t 201007250000 .earliest
    touch -t 201007260000 .latest
    find . -name 'tmp.*' -newer .earliest \! -newer .latest
    rm .earliest .latest
    

    找到 命令递归地探索子目录。如果你不想这样:

    find . -name 'tmp.*' -daystart -mindepth 1 -maxdepth 1 -mtime 7
    

    如果要按大小排序文件:

    find . -name 'tmp.*' -daystart -mtime 7 -printf '%s\t%p\n' | sort -n -k 1 | cut -f 2-
    

    从未 使用 找到 在backticks,你用的方法 长征 ,因为如果文件名包含空格或某些特殊字符,这将失败,因为shell会分割 `command` -exec 找到 ; 版本执行 mycommand 每个文件一次 {} + 版本通常调用 我的命令 {}

    find . -name 'tmp.*' -daystart -mtime 7 -exec mycommand -myoption {} \;
    find . -name 'tmp.*' -daystart -mtime 7 -exec mycommand -myoption {} +
    
        2
  •  1
  •   mvds    16 年前

    获取所有文件名 tmp.* ,使用

    $ ls -lS tmp.*
    

    find ,它可以将文件列表形状设置为您喜欢的任何形式:

    $ find tmp.* -printf "%s %CD %f\\n" | grep "07/25/10" | sort -n
    

    ( man find 找到