我有一个 Google Photos 文件夹。这是来自 Google Photos Takeout。Takeout 的工作方式是,有多个以日期命名的文件夹
➜ ~/Google Photos => tree |head -n 20
.
├── 1979-12-31
│ ├── icon-24x24.png
│ ├── icon-24x24.png.json
│ ├── icon_local_color.png
│ ├── icon_local_color.png.json
│ ├── metadata.json
│ ├── viewer-14.png
│ ├── viewer-14.png.json
│ ├── viewer-28.png
│ └── viewer-28.png.json
├── 2001-07-24
│ ├── heic0109a.jpg
│ ├── heic0109a.jpg.json
│ └── metadata.json
├── 2003-01-06
│ ├── ASPdotNET_logo.jpg
│ ├── ASPdotNET_logo.jpg.json
│ ├── darkBlue_GRAD.jpg
│ ├── darkBlue_GRAD.jpg.json
我想将所有不以 json 结尾的文件移动到名为 的新文件夹./all_photos
。问题是文件夹中可能有两个同名文件。
例如,在文件夹中1979-12-31
,我可能有一个名为 的文件a.jpg
,而在 文件夹中,2001-07-24
我可能还有另一个名为 的文件a.jpg
。我研究过的解决方案是移动文件,但覆盖或跳过(如果存在潜在覆盖)。我想更改文件名,如下所示:1979-12-31_a.jpg
和2001-07-24_a.jpg
。这将确保没有同名文件,因此不会覆盖。
我在 Linux 服务器上,我想执行此操作的最佳方法是通过 Linux find 命令,但我不确定确切的命令,因此希望得到帮助。
答案1
我编写的脚本解决了这个问题。可能不是最有效的方法,但如果有更有效的方法,请告诉我。采用一个参数 - 您想要应用脚本的文件夹名称。在上面的例子中,我将运行./script.sh Google\ Photos
。适用于 2 级子文件夹。
#!/bin/bash
shopt -s extglob
for x in `ls $1`
do
for y in $1/$x/!(*.json)
do
a=${y#"$1/$x/"}
mv $y "$1/$x-$a"
done
done