关于linux:如何将文件移动到Bash中的相应文件夹中

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部分创建文件夹,并将其移动到相应的文件夹中。(如20170129-aaa.jpg->201701/20170129-aaa.jpg)。但如果一个文件在本月,我想保持原样。我刚接触bash,在awk、uniq、substring上的尝试都失败了。我怎样才能做到这一点?


您可以像在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
  • 变量保存当前年份月份。
  • 所有带有""的文件?????????????.JPG"模式被检查。
  • 将提取文件名中的月份。
  • 如果文件的月份等于当前月份,则跳过
  • 如果目标目录不存在,则创建它
  • 确保目标目录在那里,否则mv会变成破坏性的。
  • 最后移动文件
  • 这段代码中有一个错误:如果一个目标目录(如"201702")已经存在,但不可写,那么mv将失败。如果目录不存在,则创建该目录,并假定刚创建的目录是可写的(通常是…我们100%确定吗?)-)


    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