本文目录导读:

我们可以通过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
这些脚本会按 年/月 或 年/月/日 的结构整理照片,你可以根据需要调整日期格式,建议先在不重要的照片上测试,确认效果后再处理重要文件。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播