自动创建文件夹和移动文件

Create folders automatically and move files

我有很多来自数据记录器(波形)的按小时排序的日常文件。我下载在U盘里,现在我需要把它们保存在以波形的前8个字符命名的文件夹中。

这些文件具有以下模式:

Year-Month-Day-hourMinute-##.Code_Station_location_Channel

比如我的U盘里面有:

2020-10-01-0000-03.AM_REDDE_00_EHE; 2020-10-01-0100-03.AM_REDDE_00_EHE; 2020-10-02-0300-03.AM_REDDE_00_EHE; 2020-10-20-0000-03.AM_REDDE_00_EHE; 2020-10-20-0100-03.AM_REDDE_00_EHE; 2020-11-15-2000-03.AM_REDDE_00_EHE; 2020-11-15-2100-03.AM_REDDE_00_EHE; 2020-11-19-0400-03.AM_REDDE_00_EHE; 2020-11-19-0900-03.AM_REDDE_00_EHE;

我修改了来自@user3360767 (shell script to create folder daily with time-stamp and push time-stamp generated logs) 的代码,以加快创建文件夹并将文件移动到其中的过程

for filename in 2020-10-01*EHE; do  
    foldername=$(echo "$filename" | awk '{print (201001)}');
    mkdir -p "$foldername"  
    mv "$filename" "$foldername"
    echo "$filename $foldername" ;
done

2020-10-01*EHE

这里我列出了从 2020-10-01-0000-03 开始​​的所有时间。AM_REDDE_00_EHE

foldername=$(echo "$filename" | awk '{print (201001)}');

我在这里创建属于 2020-10-01 的文件夹,并使用以下行创建文件夹,然后将所有文件移动到创建的文件夹。

    mkdir -p "$foldername"  
    mv "$filename" "$foldername"
    echo "$filename $foldername" ;

您可能会注意到,每次文件更改日期时,我总是需要修改行 for filename in 2020-10-01*EHE。 有没有办法尝试用文件的前 8 位数字创建文件夹?

托尼诺

使用date

并且由于 foldername 不会改变,您不需要在循环中继续创建一个。

files="$(date +%Y-%m-%d)*EHE"
foldername=$(date +%Y%m%d)
mkdir -p "$foldername"
for filename in $files; do  
    mv "$filename" "$foldername"
    echo "$filename $foldername" 
done

编辑:

如果你想每次都指定文件夹,你可以将其作为参数传递并使用sed获取文件名模式

foldername=
files=$(echo  | sed 's/\(....\)\(..\)\(..\)/--/')
filepattern="$files*EHE"
mkdir -p "$foldername"
for filename in $filepattern; do
  mv "$filename" "$foldername"
  echo "$filename $foldername"
done

你用

调用它
./<yourscriptname>.sh 20101001

我认为您想将名称以 *EHE 结尾的所有文件移动到子目录中。子目录将根据需要创建,并根据每个文件名开头的日期命名,不带 dashes/hyphens.

请在某个临时目录中的文件副本 上测试以下

#!/bin/bash

for filename in *EHE ; do
    # Derive folder by deleting all dashes from filename, then taking first 8 characters
    folder=${filename//-/}
    folder=${folder:0:8}
    echo "Would move $filename to $folder"
    # Uncomment next 2 lines to actually move file
    # mkdir -p "$folder"
    # mv "$filename" "$folder"
done

示例输出

Would move 2020-10-01-0000-03.AM_REDDE_00_EHE to 20201001
Would move 2020-10-01-0100-03.AM_REDDE_00_EHE to 20201001

注意两行:

folder=${filename//-/}
folder=${folder:0:8}

使用 "bash 参数替换"here 如果您想了解它,并避免创建全新的需要处理 运行 awksedcut 以提取字段。