ディレクトリ内のls -1 .
デフォルトの順序(アルファベット順など)でリストされている各ファイルに対して、次のことをしたいと思います。
このファイルから始めて、このファイルを含む次のファイルを見つけて、名前付き配列
n
に入れてtrain
サブディレクトリにコピーしますtmp
。最初のファイルを見つけ、
n+1
名前付き変数に入れます。test
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にコピーし、それを見つけて変数に入れます。その後、およびについていくつかのタスクを実行します。最後に空のディレクトリ 。a
b
train
tmp
c
test
train
test
tmp
tmp
の場合とをb
見つけて上書きして配列に入れ、dirにコピーし、見つけて上書きして変数に入れます。その後、およびについていくつかのタスクを実行します。最後に空のディレクトリ 。b
c
train
tmp
d
test
train
test
tmp
tmp
c
その後、= 2なので、合計については上記の操作を実行しますが、合計についてはd
実行しません。e
f
n
答え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
ファイルをサブディレクトリにコピーします。ループが終了すると、次のファイル名が入力されます。train
i
tmp
test
今「何かしてみてください」。
オフセットを増やしてi
もう一度繰り返します。
個人的に私はこれにPerlを使います。