「ls -1」と記載されている各ファイルについて、次の「n」ファイルと「n + 1」ファイルを見つける方法

「ls -1」と記載されている各ファイルについて、次の「n」ファイルと「n + 1」ファイルを見つける方法

ディレクトリ内のls -1 .デフォルトの順序(アルファベット順など)でリストされている各ファイルに対して、次のことをしたいと思います。

  1. このファイルから始めて、このファイルを含む次のファイルを見つけて、名前付き配列nに入れてtrainサブディレクトリにコピーしますtmp

  2. 最初のファイルを見つけ、n+1名前付き変数に入れます。test

  3. train、 、および に対してtestいくつかのタスクを実行しますtmp。削除tmp

train再利用され、リストさtestれているすべてのファイルで上書きする必要がありますls

tmpリストされている各ファイルについて、上記の手順を開始する前に空でなければなりませんls

n開始する最初のファイルがlsないため、リストされた最後のファイルを除くすべてのファイルに対してこれらの3つのステップが実行されます。n+1

上記をbashで実装する方法を知りたいです。ありがとうございます。

例えば

2を想定すると、n現在のディレクトリにリストされているファイルは次のようになります。ls

a
b
c
d
e
f

の場合、それを見つけaて配列に入れてdirにコピーし、それを見つけて変数に入れます。その後、およびについていくつかのタスクを実行します。最後に空のディレクトリ 。abtraintmpctesttraintesttmptmp

の場合とをb見つけて上書きして配列に入れ、dirにコピーし、見つけて上書きして変数に入れます。その後、およびについていくつかのタスクを実行します。最後に空のディレクトリ 。bctraintmpdtesttraintesttmptmp

cその後、= 2なので、合計については上記の操作を実行しますが、合計についてはd実行しません。efn

答え1

#!/bin/bash

declare -a all
all=(`ls -1 | grep -v '^tmp$'`)
n=2
i=0

while [ $((n+i)) -lt ${#all[*]} ]; do
    declare -a train
    j=0
    while [ $j -lt $n ]; do
            train[$j]=${all[$((i+j))]}
            cp ${all[$((i+j))]} tmp/
            j=$((j+1))
    done
    test=${all[$((i+j))]}
    i=$((i+1))
    # do something:
    echo "loop $i: contents of tmp/ are" $(ls tmp)", test=$test"
    rm -f tmp/*
done

まず、すべてのファイルを配列に入れますall

配列にスペースがある場合は繰り返します(オフセットiに数字を加えた値はnファイルリストの長さよりも短い)。

ループを使用して、ファイル名をオフセットで始まる配列に入れ、nファイルをサブディレクトリにコピーします。ループが終了すると、次のファイル名が入力されます。trainitmptest

今「何かしてみてください」。

オフセットを増やしてiもう一度繰り返します。

個人的に私はこれにPerlを使います。

関連情報