将文件从子目录递归移动到新文件夹(除 json 之外的所有文件 [jpg/png/...])

将文件从子目录递归移动到新文件夹(除 json 之外的所有文件 [jpg/png/...])

我有一个 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.jpg2001-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

相关内容