加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – find,xargs:为每个文件执行命令链

发布时间:2020-12-16 01:49:42 所属栏目:安全 来源:网络整理
导读:如果问题标题不够丰富,我很抱歉.请随意提出更好的变体. 我想执行以下任务: 在一个目录中,我有许多文件是JPEG格式的照片.我想从EXIF中提取拍摄照片的日期,为每个日期创建一个新目录,并将文件移动到相关目录. (EXIF日期和时间格式为YYYY:MM:DD hh:mm:ss,
如果问题标题不够丰富,我很抱歉.请随意提出更好的变体.

我想执行以下任务:
在一个目录中,我有许多文件是JPEG格式的照片.我想从EXIF中提取拍摄照片的日期,为每个日期创建一个新目录,并将文件移动到相关目录.

(EXIF日期和时间格式为YYYY:MM:DD hh:mm:ss,我希望目录名称格式为YYYY-MM-DD,这就是我使用sed的原因)

我知道如何分别执行这些任务,但未能将它们组合在一起.我花了一些时间研究如何使用find with -exec或xargs执行命令,但仍然无法理解如何正确链接所有内容.

最后,我能够使用两个命令完成我的任务:

find . -name '*.jpg' -exec sh -c "identify -format %[exif:DateTimeOriginal] {}
    | sed 's/ [0-9:]*//; s/:/-/g' | xargs mkdir -p" ;

find . -name '*.jpg' -exec sh -c "identify -format %[exif:DateTimeOriginal] {}
    | sed 's/ [0-9:]*//; s/:/-/g; s/$///' | xargs mv {}" ;

但我不喜欢重复,我不喜欢-exec sh -c.有没有正确的方法在一行中执行此操作而不使用-exec sh -c?

解决方法

不是专注于单行,更好的解决方案是将逻辑放入脚本中,以便于执行和测试.把它放在一个名为movetodate.sh的文件中:

#!/usr/bin/env bash

# This script takes one or more image file paths

set -e
set -o pipefail

for path in "$@"; do
    date=$(identify -format %[exif:DateTimeOriginal] | sed 's/ [0-9:]*//; s/:/-/g')
    dest=$(dirname "$path")/$date
    mkdir -p "$dest"
    mv "$path" "$dest"
done

然后,调用它:

find . -name '*.jpg' -exec ./movetodate.sh {} +

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读