协议是这样的,我的女朋友希望我将她的所有照片从她的 iPhone 转移到她的笔记本电脑上(我们运行的是 Ubuntu 14.04)。我尝试使用的所有专用程序都不起作用,所以我只是复制了整个 DCIM/ 文件夹,其中包含她 iPhone 上的所有图片。我的困境是 DCIM/ 被分为四个文件夹,其中包含她的每张照片的单独文件夹。在每个文件夹中,每张图片都具有相同的名称“5003.jpg”。
我想使用命令行将所有这些文件移动并重命名(可能使用升序数字名称,例如 0001.jpg、0002.jpg 等)到一个文件夹,例如 ~/Pictures/iPhone/。
到目前为止,我所做的就是编译每个文件的所有单独路径的文本文件。
一些示例路径名称:
/home/jennie/Pictures/DCIM/101APPLE/IMG_1703.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1431.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1933.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1388.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1954.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1524.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1897.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1582.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1007.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101APPLE/IMG_1502.JPG/5003.JPG
答案1
由于您对最终文件名很灵活,并且这些是来自现代智能手机的照片,因此我建议exiftool
您自动组织和重命名照片:
- 首先,复制/备份您的内容
~/Pictures/iPhone
,以便您在需要时总有可以依靠的东西 exiftool
使用以下选项在命令提示符下运行:
$ exiftool -P -r '-FileName<DateTimeOriginal' -d ~/outdir/%Y-%m-%d/%H/%Y-%m-%d_%H.%M.%S.%%e ~/Pictures/iPhone
这应该会清空您的照片~/Pictures/iPhone
,并根据 iPhone 自动嵌入到每张照片中的 EXIF 时间戳数据重新组织和重命名它们,并将其放入新生成的~/outdir
目录中。生成的目录路径和图像文件名将如下所示:
~/outdir/2016-01-03/10/2016-01-03_10.38.58.jpg
安装中
如果没有exiftool
,您可以安装
$ sudo apt-get install libimage-exiftool-perl
选项
'-FileName<DateTimeOriginal'
是字面意思,是论证的一部分-d
指定目标模板,您可以更改~/outdir
为您选择的另一个路径- 目前,该
%H/
部分是在每个日期目录中进一步创建每小时子目录。如果您不想有这样的每小时子目录,您可以省略小时部分,如下所示:~/outdir/%Y-%m-%d/%Y-%m-%d_%H.%M.%S.%%e
- 或者,如果您甚至不需要每个日期的目录,只想直接在 中包含图像
~/outdir
,您可以省略日期目录部分,只需执行以下操作:~/outdir/%Y-%m-%d_%H.%M.%S.%%e
答案2
#!/bin/bash
appledir="$HOME/Pictures/DCIM/101APPLE"
jpgname="5003.JPG"
for dir in "$appledir"/*
do if [[ -d "$dir" ]]
then
newfile="$appledir/${dir##*/}"
mv "$dir"/5003.JPG "$newfile.tmp" &&
rmdir "$dir" &&
mv "$newfile.tmp" "$newfile"
fi
done
初始树如下:
$ tree Pictures/
Pictures/
└── DCIM
└── 101APPLE
├── IMG_1002.JPG
│ └── 5003.JPG
├── IMG_1003.JPG
│ └── 5003.JPG
└── IMG_1004.JPG
└── 5003.JPG
执行脚本 ( ./script.sh
) 后,这将是树:
$ tree Pictures/
Pictures/
└── DCIM
└── 101APPLE
├── IMG_1002.JPG
├── IMG_1003.JPG
└── IMG_1004.JPG
编辑:
要将*.PNG
文件重命名回*.JPG
,请使用:
for name in "$HOME/Pictures/DCIM/101APPLE"/*.PNG
do mv -i "$name" "${name%PNG}JPG"
done
答案3
您可以在一行中使用它:
find -name '*.JPG' | awk 'BEGIN{ i=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, i++ }'| bash
例如,从 /Pictures 文件夹中使用它。您搜索所有 JPG 文件,之后,awk 管道获取源并将其添加到 4 位计数器中。我们发送 bash 这个管道
答案4
例如有这个
cat list-of-files
path1/file1
path2/file1
我们能做到这一点。最好a
每次都重置变量:
a=0; cat list-of-files | while read -r f; do
echo mv -v "$f" $((++a)).jpg
done
mv -v path1/file1 1.jpg
mv -v path2/file1 2.jpg
回声检查。删除它以进行实际删除。