我一直在使用以下脚本将我的照片组织到“日期”目录中:
for x in *.JPG; do
d=$(date -r "$x" +%Y-%m-%d)
mkdir -p "$d"
mv -- "$x" "$d/"
done
Run Code Online (Sandbox Code Playgroud)
这个脚本很好用。我的照片文件遵循相同的命名约定“IMG_20131125_090000.JPG”,即拍摄日期和时间。有没有办法更改上面的脚本,以便它仍然分类到日期目录中,但使用文件名中的日期而不是使用文件的修改日期?
我有以下脚本从基于我的系统上的EXIF命令中提取数据busybox ash
。我从文件末尾解析日期标签,并case
用作最终检查以确保格式正确。我的问题是最后的if
语句似乎总是返回 true;即 d="$e - Jebby (exif"
总是运行。如果 Iecho $en
并且echo $dn
它显示$en大于$dn但该if
语句仍然运行d="$e - Jebby (exif"
.
x=<valid filename>
e=$(exif -d -m -t 0x9003 -- "$x" 2>/dev/null)
let l=${#e}-18
e=$(expr substr "$e" $l 19)
e="${e%[ ][0-2][0-9][:][0-6][0-9][:][0-6][0-9]*}"
e="${e##*[!1-2][!09][!0-9][!0-9][!:][!0-1][!0-9][!:][!0-3][!0-9]}"
e=$(expr substr "$e" 1 4)$(expr substr "$e" 6 2)$(expr substr "$e" 9 2)
case "$e" in
[1-2][09][0-9][0-9][0-1][0-9][0-3][0-9])
let en=$e+3
ds="${d% - Jebby (}" …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将目录名称输入 for 循环。我的代码如下:
td='/Test/TopDir/'
cd "$td"
for x in $(ls -d */ | cut -f1 -d'/'); do
echo x=$x
done
Run Code Online (Sandbox Code Playgroud)
运行 ls 命令时,我运行它的顶级目录如下所示:
ls -l
drwxrwxrwx 4 Jason users 4096 May 6 06:36 2014-02-02 - Jebby (
drwxrwxrwx 3 Jason users 4096 May 6 06:09 2014-02-04 - Jebby (
drwxrwxrwx 2 root root 4096 May 6 06:09 @eaDir
-rw-r--r-- 1 Jason users 3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r-- 1 Jason users 3927603 Jan 26 10:18 DSC01063.JPG
Run Code Online (Sandbox Code Playgroud)
我的for循环结果如下:
x=2014-02-02
x=-
x=Jebby …
Run Code Online (Sandbox Code Playgroud) 我的大部分照片文件都有以下命名约定/格式 IMG_20131204_120000.JPG,显示照片拍摄的日期和时间(iPhone/Apple 命名约定)。但是,并非我的所有照片都遵循此命名约定。在这个论坛的帮助下,我开发了以下脚本来将我的照片分类到日期目录中:
cd '/photos/'
for x in *.JPG *.jpg *.TIF *.tif *.PNG *.png *.BMP *.bmp *.GIF *.gif *.IMG *.img *.JPEG *.jpeg *.TIFF *.tiff; do
d=$(date -r "$x" +%Y%m%d)" - Family Photos"
t=$(expr substr "$x" 1 4)
if [ "$t" == "IMG_" ]; then
d=$(expr substr "$x" 5 8)" - Family Photos"
fi
mkdir -p "$d" >/dev/null 2>&1
mv -- "$x" "$d/" >/dev/null 2>&1
done
Run Code Online (Sandbox Code Playgroud)
附注。如果文件名的格式为 IMG_20131204_120000.JPG,我使用 IF 语句从文件名本身获取日期,因为此日期最准确地反映了照片实际拍摄的日期,但如果文件不遵循此命名约定,我取上次修改/创建文件的操作系统日期。
除了文件以“IMG_”开头但不符合命名约定 IMG_20131204_120000.JPG(例如名为 IMG_001.JPG 或 IMG_Photo1 的文件)之外,它在大多数情况下都能正常工作。有没有更好的方法来构造 IF 语句,以便它不仅检查文件是否以“IMG_”开头,而且接下来的 8 个字符是数字/日期格式?