使用字符串对文件进行排序

使用字符串对文件进行排序

我有一个包含 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

这可以用更少的步骤和变量来完成,但我认为上面的内容有助于说明一种方法。

答案2

不确定我是否完全理解你的请求,但你可能想尝试一下这会让你走多远(假设bashshell 就像你最近的帖子中那样):

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如果对所看到的内容感到满意,请删除。

相关内容