How to move files into corresponding folders in Bash
我有一个文件夹,其中包含以下文件:
1 2 3 4 5 | 20170129-aaa.jpg 20170130-bbb.jpg 20170131-ccc.jpg 20170201-ddd.jpg 20170202-eee.jpg |
如果某个文件不在当前月份,我希望基于文件的YYYYMM部分创建文件夹,并将其移动到相应的文件夹中。(如
您可以像在bash中这样循环访问文件:
1 2 3 4 5 6 7 | shopt -s nullglob today=$(date +%Y%m) for file in ${today}??-???.jpg; do dir=${file:0:6} mkdir -p"$dir" || continue mv"$file""$dir/$file" done |
date +%Y%M 以yyyymm格式提取当前日期shopt -s nullglob 确保在没有匹配文件的情况下,glob不会扩展到任何内容。- global
${today}??-???.jpg 确保循环提取匹配的文件 dir=${file:0:6} 从文件名中提取yymm部分mkdir -p 创建目录(如果dir已经存在则忽略)- 如果目录创建失败,
|| continue 将跳过该文件。
相关员额:
shell脚本中的YYYY-MM-DD格式日期
提取bash中的子字符串
关于
shopt 的gnu-bash手册。
此脚本执行您所需的操作(基于codeforester的答复):
1 2 3 4 5 6 7 8 9 10 11 | curmonth=$(date +%Y%m) for filename in ????????-???.jpg; do filemonth=${filename:0:6} [ $curmonth = $filemonth ] && continue; [ ! -d $curmonth ] && mkdir $curmonth if [ ! -d $curmonth/. ]; then echo"$0: error: Can not create directory $curmonth" break fi mv $filename $curmonth done |
这段代码中有一个错误:如果一个目标目录(如"201702")已经存在,但不可写,那么
1 2 3 4 5 6 | IDX=$(ls *.jpg -1 | xargs -n1 basename | cut -b 1-6 | uniq | wc -l) for YYYYMM in $(ls $FILEDIR/*.jpg -1 | xargs -n1 basename | cut -b 1-6 | uniq | head -$(($IDX-1))); do mkdir -p $FILEDIR/$YYYYMM mv"$FILEDIR/$YYYYMM"*.jpg $FILEDIR/$YYYYMM done |