将多个文件移动到具有相同名称的不同文件夹

时间:2019-06-05 11:59:24

标签: shell

我有一些数据,这些数据是针对几个工作站的,这些数据与它们所在的工作站是分开的,并且记录了它们的日期,因此对于工作站1,例如,我有多个名为2019.001,2019.002等的文件夹,并且在其中文件夹中有以HHZ结尾的文件(所有文件都具有相同的名称)。我要做的是从每个工作站中获取这些文件,并将它们放置在另一个文件夹中,同时将它们重命名为上方的文件夹名称并保持工作站的名称,然后创建与它们名称相对应的文件夹。我的实际问题是如何移动与当天对应的文件,例如2019.001.station12019.001.station2到文件夹2019.001中。

dir0=`pwd`
mkdir -p data || exit 1
for pathname in $dir0/stam/*/*HHZ; do
    cp "$pathname" "data/$( basename "$( dirname "$pathname" )" )STAMHHZ"
done

for pathname in $dir0/macu/*/*HHZ; do
    cp "$pathname" "data/$( basename "$( dirname "$pathname" )" )MACUHHZ"
done


cd $dir0/data
mkdir 2019.0{10..31}
mkdir 2019.00{1..9}

如果还有另一种执行代码的部分来存放文件的方法,那么我可以归纳为好几个工作站,因为我现在只使用两个工作站,但将来我会与更多人合作。

这是数据所在的树

macu
├── 2019.001
│   └── MACUHHZ
├── 2019.002
│   └── MACUHHZ
├── 2019.003

stam
├── 2019.001
│   └── STAMHHZ
├── 2019.002
│   └── STAMHHZ
├── 2019.003
│   └── STAMHHZ

因此理想情况下,最终情况将是:

data
├── 2019.001
│   ├── 2019.001MACUHHZ
│   └── 2019.001STAMHHZ

依此类推

1 个答案:

答案 0 :(得分:0)

下面的脚本创建所需的文件结构。您要从中复制数据的顶级目录(在示例中为macustam)应添加到top_dir变量中。您也可以将其更改为使用通配符,或从文件中读取通配符,等等。

基本思想很简单:对于每个顶级目录,每个数据目录,在data中创建对应的目录,并为每个文件复制文件。

pushdpopd用作简单的技巧,以使*通配符符合我们的要求。 $dir0包含操作的根文件夹,因此我们始终知道data在哪里。

set -e用于在出现错误时立即退出。

#!/bin/bash
set -e

top_dirs=( macu stam )

dir0="$(pwd)"

mkdir -p data

for dir in "${top_dirs[@]}" ; do
    pushd "$dir" >/dev/null

    for datadir in * ; do
        mkdir -p "$dir0/data/$datadir"
        pushd "$datadir" >/dev/null

        for file in *HHZ ; do
            cp "$file" "$dir0/data/$datadir/$datadir$file"
        done

        popd >/dev/null
    done

    popd >/dev/null
done