文字列を使用したファイルのソート

文字列を使用したファイルのソート

同じ形式に従う1000を超えるファイルを含むディレクトリがあります。サンプルファイルは次のとおりです。

giroof-doas-ob10roof-L1-202007020832-10.std

2020年はどこにありますか

月は07です

仕事は02

時間は08

分は32分です。

高度は10です。

日付と時刻を読み、それを同じ名前のフォルダーにソートし、高度に応じてサブディレクトリーにソートするスクリプトを作成したいと思います。サンプルファイルがフォルダにコピーされます。

../0208/10.std/

文字列関数を使用して、日付と時刻を読み込み、そのフォルダを作成し、ディレクトリも作成できます(下記参照)。私の問題は、「文字列の読み取り」を使用するとファイルをコピーできないことです。

これはファイルがある場所です。 (スクリプトの試みを説明し、切り取り機能を使用する理由を説明するのに役立ちます。

#/home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/giroof-doas-ob10roof-L1-202007020832-10.std
#!/bin/bash

#/home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/giroof-doas-ob10roof-L1-202007020832-10.std


list=$(ls /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/*.std)
#echo "$list"

dir="$(cut -d'/' -f8 <<<"$list")"

loca="$(cut -d'-' -f5 <<<"$dir")"

elevstd="$(cut -d'-' -f6 <<<"$dir")"


hello="$(cut -c 7-10 <<< "$loca")"

mkdir /home/lmdjeu/test/hello/$hello


elev="$(cut -c 1-2 <<< "$elevstd")"
#echo "$elev"

for dir in /home/lmdjeu/test/hello/*/;
   do
      mkdir -- "$dir"/{00.std,01.std,02.std,03.std,04.std,05.std,06.std,07.std,08.std,09.std,10.std,ref};
   done


stddir=/home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles
elevdir=/home/lmdjeu/test/hello

これは私が改善したいスクリプト領域です。日付と時刻が変更されても、ファイルを適切なディレクトリとサブディレクトリにコピーできるようにしたいです。

for i in {00..10}; do
  cp $stddir/giroof-doas-ob10roof-L1-2020070111*-"$i".std $elevdir/0111/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070112*-"$i".std $elevdir/0112/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070113*-"$i".std $elevdir/0113/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070114*-"$i".std $elevdir/0114/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070115*-"$i".std $elevdir/0115/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070116*-"$i".std $elevdir/0116/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070117*-"$i".std $elevdir/0117/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070118*-"$i".std $elevdir/0118/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070119*-"$i".std $elevdir/0119/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070120*-"$i".std $elevdir/0120/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070121*-"$i".std $elevdir/0121/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070122*-"$i".std $elevdir/0122/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070123*-"$i".std $elevdir/0123/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070200*-"$i".std $elevdir/0200/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070201*-"$i".std $elevdir/0201/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070202*-"$i".std $elevdir/0202/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070203*-"$i".std $elevdir/0203/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070204*-"$i".std $elevdir/0204/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070205*-"$i".std $elevdir/0205/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070206*-"$i".std $elevdir/0206/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070207*-"$i".std $elevdir/0207/"$i".std
  cp $stddir/giroof-doas-ob10roof-L1-2020070208*-"$i".std $elevdir/0208/"$i".std
done




cp $stddir/giroof-doas-ob10roof-L1-2020070111*.ref  $elevdir/0111/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070112*.ref  $elevdir/0112/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070113*.ref  $elevdir/0113/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070114*.ref  $elevdir/0114/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070115*.ref  $elevdir/0115/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070116*.ref  $elevdir/0116/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070117*.ref  $elevdir/0117/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070118*.ref  $elevdir/0118/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070119*.ref  $elevdir/0119/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070120*.ref  $elevdir/0120/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070121*.ref  $elevdir/0121/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070122*.ref  $elevdir/0122/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070123*.ref  $elevdir/0123/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070200*.ref  $elevdir/0200/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070201*.ref  $elevdir/0201/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070202*.ref  $elevdir/0202/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070203*.ref  $elevdir/0203/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070204*.ref  $elevdir/0204/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070205*.ref  $elevdir/0205/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070206*.ref  $elevdir/0206/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070207*.ref  $elevdir/0207/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070208*.ref  $elevdir/0208/ref/

ベストアンサー1

私はそうします:

まず、新しいディレクトリの場所を定義します。

newdir='/home/lmdjeu/test/hello'

これでcd、すべてのファイルがあるディレクトリに移動します。

cd /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles

ここでforループを開始してこのディレクトリのファイルを繰り返します*.std(追加はこのforループ内で行われます)。

for i in *.std; do

ファイル名の日付文字列部分に日付と時刻の値が必要で、.日付文字列は常に12桁であるため、簡単に定義できます。

    datestring=$(echo "$i" | grep -Eo '[0-9]{12}')

日/時間値を定義します。

    dayhr=$(echo $datestring | cut -c7-10)

高度値を定義します。

    elev=$(echo "$i" | grep -o '[0-9]\+.std')

次に、ファイルが移動されるディレクトリを定義する変数を一緒に構成します。

    loc="$newdir"'/'"$dayhr"'/'"$elev"

最後にディレクトリを作成し、そこにファイルを移動してforループを閉じます。

    mkdir -p "$loc" && mv "$i" "$loc"
done

このようにして、各ファイルが移動されるディレクトリ/サブディレクトリは常にファイル名から派生し、必要に応じてディレクトリが作成され、ファイルがそのディレクトリに移動されます。すべてをスクリプトに入れます。

newdir='/home/lmdjeu/test/hello'
cd /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles || exit 1
for i in *.std; do
    datestring=$(echo "$i" | grep -Eo '[0-9]{12}')
    dayhr=$(echo $datestring | cut -c7-10)
    elev=$(echo "$i" | grep -o '[0-9]\+.std')
    loc="$newdir"'/'"$dayhr"'/'"$elev"
    mkdir -p "$loc" && mv "$i" "$loc"
done

少数のステップと変数を使用してこれを行うことができますが、上記は1つのアプローチを説明するのに役立ちます。

おすすめ記事