【发布时间】:2020-11-24 02:39:37
【问题描述】:
我有一个文件夹,其中包含 1981-2019 年 geotiff 格式的每日降雨数据,命名约定为 chirps-v2.0.yyyymmdd.1days.tif
我想根据MONTH信息整理所有文件,并移动到一个新文件夹,即所有月份=一月的文件都将移动到Month01文件夹。
是否有任何单线解决方案,我在 macos 上使用终端。
【问题讨论】:
标签: macos file-copying
我有一个文件夹,其中包含 1981-2019 年 geotiff 格式的每日降雨数据,命名约定为 chirps-v2.0.yyyymmdd.1days.tif
我想根据MONTH信息整理所有文件,并移动到一个新文件夹,即所有月份=一月的文件都将移动到Month01文件夹。
是否有任何单线解决方案,我在 macos 上使用终端。
【问题讨论】:
标签: macos file-copying
我认为没有简单的方法可以做到这一点。但是,如果您使用管道和 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 日的每日文件。
应该这样做:
for i in $(seq -f "%02g" 1 12); do mkdir -p "Month$i"; mv chirps-v2.0.????$i*.tif "Month$i"; done
解释:
Month01、Month02等。如果目录已经存在,继续。chirps-v2.0.????$i*.tif 中的问号表示单字符通配符。注意:如果您的.tif 文件名中有空格,您可以改用"chirps-v2.0."????"$i"*".tif"。
【讨论】: