如何将文件移动到Bash中的相应文件夹中

时间:2017-02-16 04:45:07

标签: linux bash

我有一个包含以下文件的文件夹:

20170129-aaa.jpg
20170130-bbb.jpg
20170131-ccc.jpg
20170201-ddd.jpg
20170202-eee.jpg

如果文件不在当月,我想根据文件的YYYYMM部分创建文件夹,并将其移动到相应的文件夹。 (例如20170129-aaa.jpg - > 201701/20170129-aaa.jpg)。但是如果一个文件在当月,我想保持原样。 我是bash的新手,我对awk,uniq,substring的尝试都失败了。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

你可以在Bash中循环浏览你的文件:

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会扩展为空白
  • glob ${today}??-???.jpg确保循环拾取匹配的文件
  • dir=${file:0:6}从文件名
  • 中提取YYYYMM部分
  • mkdir -p创建目录(如果dir已存在则忽略)
  • 如果目录创建失败,
  • || continue将跳过该文件

相关帖子:

答案 1 :(得分:1)

此脚本可以满足您的需求(基于codeforester的回复):

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
  1. 变量保存当前年份。
  2. 所有带有" ????????的文件 - ??。jpg"审查模式。
  3. 提取文件名中的月份。
  4. 如果文件的月份等于当前月份,请跳过
  5. 如果目标目录不存在,请创建
  6. 确保目标目录在那里,否则mv会破坏
  7. 最后移动文件
  8. 此代码中存在一个错误:如果目标目录(例如" 201702")已经存在但不可写,则{{1} } 将失败。如果该目录不存在,那么它就会被创建,并且假设刚刚创建的目录是可写的(通常它是......我们100%肯定吗?): - )

答案 2 :(得分:0)

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