【问题标题】:Arrange file based on month information on filename根据文件名上的月份信息排列文件
【发布时间】:2020-11-24 02:39:37
【问题描述】:

我有一个文件夹,其中包含 1981-2019 年 geotiff 格式的每日降雨数据,命名约定为 chirps-v2.0.yyyymmdd.1days.tif

我想根据MONTH信息整理所有文件,并移动到一个新文件夹,即所有月份=一月的文件都将移动到Month01文件夹。

是否有任何单线解决方案,我在 macos 上使用终端。

【问题讨论】:

    标签: macos file-copying


    【解决方案1】:

    我认为没有简单的方法可以做到这一点。但是,如果您使用管道和 for 循环,则可以执行“单线”解决方案,例如:

    for file in $(ls *.tif); do sed -r 's/(.*\.[0-9]{4})([0-9]{2})(.*)/\1 \2 \3/' <<< "$file" | awk '{print "mkdir -p dstDir/Month" $2 "; cp", $1 $2 $3, "dstDir/Month" $2}' | bash ; done
    

    稍微格式化一下:

    for file in $(ls *.tif); do \
        sed -r 's/(.*\.[0-9]{4})([0-9]{2})(.*)/\1 \2 \3/' <<< "$file" \
        | awk '{print "mkdir -p dstDir/Month" $2 "; cp", $1 $2 $3, "dstDir/Month" $2}' \
        | bash 
    done
    

    这需要从包含您的文件的目录中执行(请参阅“ls *.tif”)。您还需要将“dstDir”替换为将创建“Month01”的父目录的名称。

    这可能并不完美,但如果需要,您可以对其进行编辑。此外,如果您没有 bash,只有 zsh,将“bash”位替换为“zsh”应该仍然有效。

    【讨论】:

    • 我收到错误zsh: argument list too long: ls,是因为文件夹中的文件太多吗?我有 14,406 个文件(从 1981 年 1 月 1 日到 2020 年 6 月 10 日的每日文件。
    【解决方案2】:

    应该这样做:

    for i in $(seq -f "%02g" 1 12); do mkdir -p "Month$i"; mv chirps-v2.0.????$i*.tif "Month$i"; done
    

    解释:

    • 对于 1、12 范围内的每个数字(必要时用 0 填充)...
    • 创建目录Month01Month02等。如果目录已经存在,继续。
    • 将文件名相关部分中包含当前月份编号的所有文件移动到相应的文件夹中。 chirps-v2.0.????$i*.tif 中的问号表示单字符通配符。

    注意:如果您的.tif 文件名中有空格,您可以改用"chirps-v2.0."????"$i"*".tif"

    【讨论】:

    • 像魅力一样工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多