同じ形式に従う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つのアプローチを説明するのに役立ちます。
答え2
あなたのリクエストを完全に理解したかどうかはわかりませんが、これがどれほど役に立つかを試してみたいかもしれません(bash
シェルが最近の投稿にあるのと同じであると仮定してください)。
for i in {00..10}
do for j in {01..02}{00..23}
do echo cp $stddir/giroof-doas-ob10roof-L1-202007"$j"*-"$i".std $elevdir/"$j"/"$i".std
done
echo cp $stddir/giroof-doas-ob10roof-L1-202007"$j"*.ref $elevdir/"$j"/ref/
done
j
ループで日付/時刻を好みに合わせて調整します。簡略化のためにすべての計算ファイルを試みcp
、存在しないファイルでは失敗します。必要に応じてstderrを抑制できます。または、ファイル名の設定を関連ファイル名で具体化します。
辞書ディレクトリを作成するには、次のことを試すことができます。
cd /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/
for FN in *
do IFS=".-" read X X X X loca elev std X <<< "$FN"
# hello="${loca:6:4}"
# elevstd="$elev$std"
echo mkdir -p -- "/home/lmdjeu/test/hello/${loca:6:4}/"{{00..10}.std,ref}
done
どちらの場合も、ビューecho
に気に入ったら削除してください。