Shell脚本如何按日期整理照片文件

wen 实用脚本 1

本文目录导读:

Shell脚本如何按日期整理照片文件

  1. 方法一:使用EXIF信息(推荐)
  2. 方法二:使用文件修改时间(无需额外软件)
  3. 方法三:更灵活的版本(支持子目录搜索)
  4. 使用方法
  5. 安装exiftool(可选)

我们可以通过Shell脚本按日期整理照片文件,常见的方法是读取照片的EXIF信息中的拍摄日期,或者使用文件的修改时间作为日期依据,以下是几种实现方式:

使用EXIF信息(推荐)

需要安装 exiftooljhead

#!/bin/bash
# 按EXIF日期整理照片脚本
# 设置源目录和目标目录
SOURCE_DIR="./photos"
TARGET_DIR="./organized_photos"
# 创建目标目录
mkdir -p "$TARGET_DIR"
# 遍历所有照片文件
find "$SOURCE_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.cr2" -o -iname "*.nef" \) | while read file; do
    # 获取EXIF拍摄日期
    date_str=$(exiftool -d "%Y/%m/%d" -DateTimeOriginal "$file" 2>/dev/null | awk -F': ' '{print $2}')
    # 如果EXIF信息不存在,使用文件修改时间
    if [ -z "$date_str" ]; then
        date_str=$(date -r "$file" "+%Y/%m/%d")
    fi
    # 创建日期目录
    mkdir -p "$TARGET_DIR/$date_str"
    # 复制文件到目标目录
    cp "$file" "$TARGET_DIR/$date_str/"
    echo "已整理: $file -> $TARGET_DIR/$date_str/"
done
echo "照片整理完成!"

使用文件修改时间(无需额外软件)

#!/bin/bash
# 按文件修改时间整理照片
SOURCE_DIR="./photos"
TARGET_DIR="./organized_by_date"
# 创建目标目录
mkdir -p "$TARGET_DIR"
# 定义图片扩展名
EXTENSIONS="jpg jpeg png gif bmp tiff raw cr2 nef"
for ext in $EXTENSIONS; do
    for file in "$SOURCE_DIR"/*.$ext; do
        if [ -f "$file" ]; then
            # 获取文件的修改日期
            year=$(date -r "$file" "+%Y")
            month=$(date -r "$file" "+%m")
            day=$(date -r "$file" "+%d")
            # 创建年/月/日目录
            target_path="$TARGET_DIR/$year/$month/$day"
            mkdir -p "$target_path"
            # 复制文件
            cp "$file" "$target_path/"
            echo "已整理: $(basename "$file") -> $target_path/"
        fi
    done
done
echo "照片整理完成!"

更灵活的版本(支持子目录搜索)

#!/bin/bash
# 更完善的照片整理脚本
# 配置
SOURCE_DIR="${1:-./photos}"  # 默认当前目录下的photos文件夹
TARGET_DIR="${2:-./organized}"  # 默认organized文件夹
USE_EXIF="${3:-true}"  # 默认使用EXIF信息
# 检查exiftool是否安装
if [ "$USE_EXIF" = true ] && ! command -v exiftool &> /dev/null; then
    echo "警告: exiftool未安装,将使用文件修改时间"
    USE_EXIF=false
fi
create_date_dirs() {
    local file="$1"
    local date_str
    if [ "$USE_EXIF" = true ]; then
        # 尝试获取EXIF拍摄日期
        date_str=$(exiftool -d "%Y-%m" -DateTimeOriginal "$file" 2>/dev/null | awk -F': ' '{print $2}')
    fi
    # 如果没有EXIF信息,使用文件修改时间
    if [ -z "$date_str" ]; then
        date_str=$(date -r "$file" "+%Y-%m")
    fi
    # 提取年月
    year=$(echo "$date_str" | cut -d'-' -f1)
    month=$(echo "$date_str" | cut -d'-' -f2)
    # 创建年/月目录
    mkdir -p "$TARGET_DIR/$year/$month"
    echo "$TARGET_DIR/$year/$month"
}
# 支持的文件类型
IMAGE_EXTENSIONS="jpg jpeg png gif bmp tiff raw cr2 nef arw dng"
echo "开始整理照片..."
echo "源目录: $SOURCE_DIR"
echo "目标目录: $TARGET_DIR"
echo "使用EXIF信息: $USE_EXIF"
echo "------------------------"
# 遍历所有文件
for ext in $IMAGE_EXTENSIONS; do
    find "$SOURCE_DIR" -type f -iname "*.$ext" | while read file; do
        target_path=$(create_date_dirs "$file")
        # 处理文件名冲突(添加序号)
        filename=$(basename "$file")
        base="${filename%.*}"
        ext="${filename##*.}"
        target_file="$target_path/$filename"
        counter=1
        while [ -f "$target_file" ]; do
            target_file="$target_path/${base}_$counter.$ext"
            counter=$((counter + 1))
        done
        # 复制文件(或使用mv移动)
        cp "$file" "$target_file"
        echo "已处理: $filename -> $(basename $(dirname $target_file))/$year/"
    done
done
echo "------------------------"
echo "照片整理完成!"

使用方法

  1. 保存脚本:将上述任一脚本保存为 organize_photos.sh

  2. 赋予执行权限

    chmod +x organize_photos.sh
  3. 运行脚本

    # 方法一(需要exiftool)
    ./organize_photos.sh
    # 方法三(自定义目录)
    ./organize_photos.sh /path/to/photos /path/to/output true

安装exiftool(可选)

# macOS
brew install exiftool
# Ubuntu/Debian
sudo apt-get install exiftool
# CentOS/RHEL
sudo yum install exiftool

这些脚本会按 年/月年/月/日 的结构整理照片,你可以根据需要调整日期格式,建议先在不重要的照片上测试,确认效果后再处理重要文件。

抱歉,评论功能暂时关闭!