我试图提取的脚本应该将文件移动到目标文件夹,并根据以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会很好。
答案 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
。