自动创建文件夹和移动文件
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 如果您想了解它,并避免创建全新的需要处理 运行 awk
、sed
或 cut
以提取字段。
我有很多来自数据记录器(波形)的按小时排序的日常文件。我下载在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 如果您想了解它,并避免创建全新的需要处理 运行 awk
、sed
或 cut
以提取字段。