如何为`ls -1`

时间:2016-01-06 23:49:11

标签: linux bash

在目录中,对于ls -1 .按照默认顺序列出的每个文件(字典顺序),我想执行以下操作

  1. 找到从文件开始并包含该文件的下一个n文件,将它们放入名为train的数组中,并将它们复制到子目录tmp中。

  2. 找到n+1个文件,将其放入名为test的变量

  3. traintesttmp上执行某些操作。删除tmp

  4. 中的文件

    traintest会被重复使用,并且应该为ls列出的每个文件覆盖。

    tmp列出的每个文件开始执行上述步骤之前,

    ls应为空。

    除了n列出的最后ls个文件外,每个文件都执行了三个步骤,因为从每个文件开始都没有n+1个文件。

    我想知道如何在bash中实现上述功能?感谢。

    例如

    假设n为2,当前目录中ls列出的文件为:

    a
    b
    c
    d
    e
    f
    

    对于a,我会找到ab并将它们放入数组train并将其复制到目录tmp中,并找到{{1}并将其放在变量c中。然后在testtraintest上执行一些操作。最后,空目录tmp

    对于tmp,我会找到bb,并通过覆盖它们将它们放入数组c,然后将它们复制到目录train中,并找到tmp并将其覆盖在变量d中。然后在testtraintest上执行一些操作。最后,空目录tmp

    然后,上述内容在tmpc上执行,但不会在de上执行,因为f = 2。

1 个答案:

答案 0 :(得分:1)

这是一个实际上没有复制或删除任何内容的例子,

#!/bin/bash    
n=3
files=( $(ls -1) )  # Store list of files in array variable "files"
limit=$(( ${#files[*]} - $n - 1 ))  # All but last n+1 files.

echo mkdir -pv tmp

for i in $(seq 0 $limit)
do
  j=$(( $i + $n ))  # I put the index in a separate variable for clarity.
  test=${files[$j]}
  train=(${files[@]:$i:$n})
  echo cp -v ${train[*]} tmp/
  echo do_something $test, ${train[*]},  tmp/
  echo rm -vf tmp/*
done

引用...