【问题标题】:How to process every second file in bash?如何处理bash中的每一秒文件?
【发布时间】:2011-06-01 00:35:38
【问题描述】:

我有一个包含几十个文件的目录。我想对这个目录中的每一秒文件做一些事情。到目前为止,我只使用了find 命令,但我处理了所有文件:

find ./dir/ -type f -exec cat {} \;

【问题讨论】:

  • 第二个文件有什么特殊的名称吗?
  • @ajreal:我正在考虑这个问题。所有文件看起来都相似,但以_tX.XXXXXXX 结尾,其中X 是一些数字。通常它们在某个范围内,例如从 0.1 到 2.0,并且它们从最小值到最大值呈几何增长。并且没有具体的文件数量。所以我可以在 0.1 到 2 的范围内有 10 个文件,或者在同一范围内有 100 个文件。我不确定是否有一些简单的模式可以匹配每个第二个文件。

标签: bash scripting find


【解决方案1】:

我每个文件都有两次,并且需要每隔一个文件删除一次。 Find 刚刚返回给我随机文件,因此我添加了一个排序。现在看起来像这样:

#!/bin/bash
DIRNAME="<directoryNameContainingYourFiles>"
for file in `find $DIRNAME -type f | sort | awk 'NR % 2 == 0'`; do
  echo "going to modify" $file
  #  ls -laFh $file           # show file details
  #  rm $file                 # delete file
  #  mv $file <newDirName>    # move file to <newDirName>
done

把它放在一个名为scriptName的文件中,运行

chmod +x scriptName

并通过调用来启动它

./scriptName

【讨论】:

    【解决方案2】:
    cnt=0; 
    for file in $(find ./dir -type f); <-- if not too many matches
    do 
      let cnt=cnt+1; 
      if [ $cnt -eq 2 ]; 
        then echo $file;               <-- do something
        cnt=0;                         <-- alternate file
      fi; 
    done
    

    second_file=$(find -type f | head -2 | tail -1);
    

    【讨论】:

    • 谢谢,它有效。在第一个示例中,您需要在 if 中添加 cnt=0 - 所以它将是每隔一个文件,而不仅仅是第二个 :)
    【解决方案3】:
    for file in `find dir -type f | awk 'NR % 2 == 0'`; do
      echo $file
    done
    

    NR 是当前行号。要获得奇数行,请使用... == 1

    【讨论】:

    • 这可能是提出的方法中最干净的。好东西。
    【解决方案4】:

    如果您想在每个备用文件上运行 my_cmd,这可能会有所帮助

     find ./dir -type f | sort -n | sed -n '1~2!p'  | sed 's/^/mycmd  /' | sh
    

    我从How to remove every other line with sed?复制了sed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多