根据文件名的月份信息排列文件

Arrange file based on month information on filename

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

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

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

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

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

稍微格式化一下:

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

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

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

应该这样做:

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 中的问号代表 single-character 个通配符。

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