我有一些数据,这些数据是针对几个工作站的,这些数据与它们所在的工作站是分开的,并且记录了它们的日期,因此对于工作站1,例如,我有多个名为2019.001,2019.002
等的文件夹,并且在其中文件夹中有以HHZ结尾的文件(所有文件都具有相同的名称)。我要做的是从每个工作站中获取这些文件,并将它们放置在另一个文件夹中,同时将它们重命名为上方的文件夹名称并保持工作站的名称,然后创建与它们名称相对应的文件夹。我的实际问题是如何移动与当天对应的文件,例如2019.001.station1
和2019.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
依此类推
答案 0 :(得分:0)
下面的脚本创建所需的文件结构。您要从中复制数据的顶级目录(在示例中为macu
和stam
)应添加到top_dir
变量中。您也可以将其更改为使用通配符,或从文件中读取通配符,等等。
基本思想很简单:对于每个顶级目录,每个数据目录,在data
中创建对应的目录,并为每个文件复制文件。
pushd
和popd
用作简单的技巧,以使*
通配符符合我们的要求。 $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