我拥有数十年的家庭照片和视频,它们被组织并标记在包含数千个目录的目录树中。文件路径通常都如下所示:
/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#./}
。