regex - 尝试使用 bash 中的捕获组重命名文件
问题描述
我在 yyyy-MM-dd/img.jpg 格式的文件夹中有一堆来自谷歌外卖的图像文件 - 我使用 phockup 来组织我的照片,它需要照片位于 yyyy/mm/dd 文件夹中。我想保留日期,因为谷歌已经给了我它们。
例如 - 此文件夹/图像应匹配
/2018-07-01/test_img.jpg
并重命名为
/2018/07/01/test_img.jpg
我曾尝试将 bash 与 sed 一起使用并找到使用正则表达式捕获组来移动文件,但我似乎运气不佳。请参阅下文了解我目前的位置
find . -name "*.jpg" -print0 | sed 'p;s/([0-9]{4})\-([0-9]{2})\-([0-9]{2})\/(.*)/$2\/$3\/$4\/$5/' | xargs -0 -n2 mv
这是我得到的错误
mv: 无法将 './2018-07-01/test_img.jpg' 移动到 ''$'\n''./2018-07-01/test_img.jpg': 没有这样的文件或目录
这似乎很奇怪,因为我认为正则表达式捕获组是正确的。我不确定为什么它不会重命名文件。
解决方案
这是一个 bash 的可能性。在具有日期命名目录的目录中运行脚本。我使用了复制命令而不是移动,因此您可以在删除旧文件之前检查结果。如果您想改用 mv,请至少运行一次,并在其前面使用 echo 进行完整性检查。
newdir=/home/me/newpics
[[ -d "$newdir" ]] || mkdir "$newdir"
for dir in *; do
if [[ -d "$dir" && "$dir" =~ ([0-9]+)-([0-9]+)-([0-9]+) ]]; then
year=${BASH_REMATCH[1]}
month=${BASH_REMATCH[2]}
day=${BASH_REMATCH[3]}
todir="$newdir/$year"; [[ -d "$todir" ]] || mkdir "$todir"
todir+="/$month"; [[ -d "$todir" ]] || mkdir "$todir"
todir+="/$day"; [[ -d "$todir" ]] || mkdir "$todir"
for file in "$dir/"*.jpg; do
base=$(basename "$file")
cp "$file" "$todir/$base"
done
fi
done
推荐阅读
- html - 尝试执行 Element.Click 命令时如何解决运行时错误
- laravel - 在 Lumen 上安装 (Laravel) Dusk
- php - 如何将请求注入 Laravel 的外观类?
- javascript - 为什么 webpack 开发服务器没有启动我的 express 服务器?
- c++ - 如何限制用户在控制台中写入的内容
- c++ - 指定 --all 时柯南无法上传包
- flutter - 如何防止 Flutter 下拉菜单隐藏其父对话框?
- javascript - 编写 ExpressJS 应用程序时,为什么不使用“new”关键字?
- javascript - 有人可以帮助我如何在放置和删除请求后立即呈现
- python-3.x - Python SQLite 将数据插入第一条记录