1

我试图提取的脚本应该将文件移动到目标文件夹,并根据以 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) 第三步:图像优化 √</p>

(4)第 4 步:将文件归档到包含日期名称的目录

(4a)通过在文件名中搜索日期字符串 ^(\d{4})-(\d{2})并创建$datePath,参见datePath=2013/08/。我把它想象成这样……</p>

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

4 回答 4

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
于 2013-08-07T16:22:43.553 回答
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
于 2013-08-07T17:10:56.893 回答
0

我认为您会发现glob有用,并且可能会在这个问题中找到一些灵感

于 2013-08-07T16:16:45.727 回答
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 ...模式可能需要一些调整,具体取决于您的源目录中还有哪些其他内容......

如果您对上面生成的建议的命令集感到满意,请删除echo前面的 from (或者只是将整个内容通过管道传输到 subshel​​l )。mv.... | bash

于 2013-08-07T16:49:16.000 回答