我有一个包含以下文件的文件夹:
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的尝试都失败了。我怎样才能做到这一点?
答案 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会扩展为空白${today}??-???.jpg
确保循环拾取匹配的文件dir=${file:0:6}
从文件名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
此代码中存在一个错误:如果目标目录(例如" 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