【问题标题】:Create folders automatically and move files自动创建文件夹并移动文件
【发布时间】:2021-03-14 19:31:56
【问题描述】:

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

这些文件具有以下模式:

年-月-日-时分-##.Code_Station_location_Channel

例如,在我的 USB 内部:

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 开始的所有时间

文件夹名=$(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 个数字创建文件夹?

托尼诺

【问题讨论】:

  • 你的问题很难理解......它只是引发了一堆不起作用的东西。也许你可以点击它下面的edit 并从你真正想要实现的目标开始更新它。您想每天早上/晚上/每周/每月自动移动一些文件吗?这些文件是由另一个程序创建的?它们需要根据文件名中的日期(或日期和时间?)(或取决于系统日期?)被移动(或复制?)到新文件夹...
  • 我的回答或其他人是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 meta.stackexchange.com/questions/5234/…

标签: linux bash move


【解决方案1】:

使用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=$1
files=$(echo $1 | sed 's/\(....\)\(..\)\(..\)/\1-\2-\3/')
filepattern="$files*EHE"
mkdir -p "$foldername"
for filename in $filepattern; do
  mv "$filename" "$foldername"
  echo "$filename $foldername"
done

你用它来称呼它

./<yourscriptname>.sh 20101001

【讨论】:

  • 变量files="$(date +%Y-%m-%d)*EHE" 没有列出所有文件它只显示2020-10-01.*EHE 然后它不能将任何文件移动到文件夹,顺便说一下文件夹名称会改变每个天
  • @tonino 我不明白。 files 没有列出所有匹配模式的文件?它使用date,因此今天的模式将是 2020-12-03*EHE 或 2020-12-02*EHE,具体取决于您的时区。
  • 我做了一个不好的解释,文件是来自数据记录器的波形,这个设备每小时以提到的格式保存信息,我下载了过去几个月的数据。主要思想是将文件移动到以前 8 个字符 (20201001) 命名的文件夹中,这是我无法管理的棘手部分
  • @tonino 如果我理解正确,您必须将它作为参数传递给脚本,检查我的编辑。
【解决方案2】:

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

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

#!/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 提取字段。

【讨论】:

  • 工作正常,非常有用的 bash 参数替换
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多