本文目录导读:

我们可以通过Shell脚本按日期整理照片文件,常见的方法是读取照片的EXIF信息中的拍摄日期,或者使用文件的修改时间作为日期依据,以下是几种实现方式:
使用EXIF信息(推荐)
需要安装 exiftool 或 jhead:
#!/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 "照片整理完成!"
使用方法
-
保存脚本:将上述任一脚本保存为
organize_photos.sh -
赋予执行权限:
chmod +x organize_photos.sh
-
运行脚本:
# 方法一(需要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
这些脚本会按 年/月 或 年/月/日 的结构整理照片,你可以根据需要调整日期格式,建议先在不重要的照片上测试,确认效果后再处理重要文件。