khu*_*hka 3 bash shell pipe find xargs
如果问题标题不够丰富,我很抱歉.请随意提出更好的变体.
我想执行以下任务:在一个目录中,我有许多文件是JPEG格式的照片.我想从EXIF中提取拍摄照片的日期,为每个日期创建一个新目录,并将文件移动到相关目录.
(EXIF日期和时间有格式YYYY:MM:DD hh:mm:ss,我希望将目录名格式化为YYYY-MM-DD,这就是我使用sed的原因)
我知道如何分别执行这些任务,但未能将它们组合在一起.我花了一些时间来调查如何执行命令,使用find带有-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 {}" \;
Run Code Online (Sandbox Code Playgroud)
但我不喜欢重复,我不喜欢-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
Run Code Online (Sandbox Code Playgroud)
然后,调用它:
find . -name '*.jpg' -exec ./movetodate.sh {} +
Run Code Online (Sandbox Code Playgroud)