在子目录中的所有 .jpg、.mp3 和 .mts 文件前面添加各自的父目录名称

在子目录中的所有 .jpg、.mp3 和 .mts 文件前面添加各自的父目录名称

我拥有数十年的家庭照片和视频,它们被组织并标记在包含数千个目录的目录树中。文件路径通常都如下所示:

/my_giant_pictures_dir/year/month_day_“事件描述”/文件名

例如:

/my_giant_pictures_dir/2016/07_27_南极洲之旅/IMG_00001.jpg

请注意,“事件”或最深目录可能包含.jpg、.mp4 和.mts 文件。

我对这种惯例的不满是,我最终会得到许多最深的媒体目录,因为它们首先按日期排列,所以只包含一个或几个文件。(例如,只拍了一张照片的日子)。这使得查看三个月期间拍摄的所有照片变得相当乏味。

我想通过保持所有内容按时间顺序排列来重组所有这些媒体,但要删除年份之后的所有中间子目录。我想通过在每个媒体文件名前面加上其父目录的“month_day_event”名称来实现这一点,例如:

代替:

/图片/2016/07_27_南极洲之旅/IMG_00001.jpg

...我宁愿:

/图片/2016/07_27_南极洲之旅_IMG_00001.jpg

是否有一个 bash 命令可以对我的整个图片目录中的每个 .jpg、.mp4 和 .mts 文件执行此操作,然后在文件名前面添加后,将它们从其父目录移出并移到下一个最高目录(在每种情况下都是年份目录)?

也许要求太多了,但它是否也能删除当时包含在年份目录中的空子目录?如有必要,我不介意运行多个命令,因为无论哪种方式,您的回答都会为我节省无数的时间。

提前非常感谢您!

答案1

尝试:

find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)' -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

怎么运行的

  • find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)'

    这将查找/my_giant_pictures_dir/名称以 jpg、mp4 或 mts 结尾的所有常规文件。依次将每个这样的文件传递给-execdir

  • -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

    这会将文件移动到其父目录,同时重命名它。

    更详细地说,-execdir bash -c '...' Bash {} \;将当前工作目录更改为文件所在的目录,并bash -c '...'使用参数Bash和文件名执行{}

    bash -c '...'在单引号中运行命令,$0其值为Bash$1其值是文件的名称。

    在单引号内,我们将mv "$1" "../${PWD##*/}_${1#./}"文件移动$到其父目录,../名称为${PWD##*/}_${1#./}

相关内容