在文件名中使用datestring来创建文件夹目录并移动文件

时间:2013-08-07 16:12:12

标签: regex shell date

我试图提取的脚本应该将文件移动到目标文件夹,并根据以YYYY-MM-DD开头的文件名将它们放在“年/月/”文件夹中。

示例:

2013-08-03-image_name.png -> ~/B/uploads/2013/08/2013-08-03-image_name.png
2012-01-01-image_name.png -> ~/B/uploads/2012/01/2012-01-01-image_name.png

行动计划

(1)设置路径变量

source=~/Desktop/A/
targetPath=~/Desktop/B/uploads/

(2)$source

中的每个文件执行这些操作
cd "$source";
for i in *.png
do
    # STEP 3
    # STEP 4
done

(3)第3步:图像优化√

(4)第4步:将文件存档到处理日期名称的目录

(4a)通过^(\d{4})-(\d{2})在文件名中搜索datestring并创建$datePath,c.f。 datePath=2013/08/。我想象这样......

awk -F … somehow put the regex here with a search and replace "-" into "/"
and save it as a variable.

(4b)创建新的目标目录(如果它不存在)并在那里移动文件。

targetDir=$targetPath$datePath
mkdir -p $targetDir
mv -v "$i" "$destination"

PS:Bash会很好。

4 个答案:

答案 0 :(得分:2)

我正在为您提供在纯BASH中查找文件目标路径的解决方案:

f='2013-08-03-image_name.png'
targetPath=~/Desktop/B/uploads/
[[ "$f" =~ ^([0-9]{4})-([0-9]{2}) ]] && \
           echo "$targetPath${BASH_REMATCH[1]}/${BASH_REMATCH[2]}/$f"

<强>输出:

~/Desktop/B/uploads/2013/08/2013-08-03-image_name.png

答案 1 :(得分:1)

我使用find + egrep进行过滤,然后使用sed来构建目标目录的名称。

cd /src
IMAGES=`find . -type f -name '*.png' -print | egrep '^./[0-9]{4}-[0-9]{2}-[0-9]{2}-.+.png$'`
for IMG in $IMAGES; do
    # optimize here
    DIR=`echo $IMG | sed -E 's/^\.\/([0-9]{4})-([0-9]{2})-[0-9]{2}-.+.png/\1\/\2/'`
    mkdir -p /dest/$DIR
    mv /src/$IMG /dest/$DIR/
done

答案 2 :(得分:0)

我认为您会发现glob有用,可能会在this question

中找到一些灵感

答案 3 :(得分:0)

这是另一个bash解决方案,不使用正则表达式/匹配:

srcdir=<whatever>
destdir=<whatever>

cd "${srcdir}"
for f in *-*-*-*.png
do
  { IFS=- read y m rest
    [[ -d "${destdir}/${y}/${m}" ]] || mkdir -p "${destdir}/${y}/${m}"
    echo mv "${f}" "${destdir}/${y}/${m}/${f}"
  } <<< "${f}"
done

for f in ...模式可能需要进行一些调整,具体取决于源目录中的其他内容...

如果您对上面提出的建议命令集感到满意(或者只是将整个事件传递到子shell echo),请从mv前面移除.... | bash