将目录结构从 /YEAR/MONTH/DAY/ 更改为 /YEAR-MONTH-DAY

将目录结构从 /YEAR/MONTH/DAY/ 更改为 /YEAR-MONTH-DAY

我需要将我的照片目录结构从 /YEAR/MONTH/DAY/ 更改为 /YEAR-MONTH-DAY

我知道这可以用 来完成exiftool,但它只适用于包含 EXIF 标签的文件,我有与每张图片相对应的 xmp-sidecar 文件,这些文件也需要一起提供。所以我认为某种脚本是最好的方法。

我坐下来尝试学习 RegEx、sedbash 等等,如果有足够的时间,我想我应该能够解决这个问题,但现在我很着急,所以任何帮助都将不胜感激。

//奥拉

答案1

Ubuntu 中的实用rename程序可以重命名目录结构,但它不会自行清理。

rename 's#(.+)/(.+)/(.+)#$1-$2-$3#' */*/*/

-vn如果您只是希望它在重命名任何内容之前告诉您它要做什么,请坚持到最后,但这里有一个小测试工具可以向您展示什么是可能的:

$ mkdir -p 2014/06/15
$ touch 2014/06/15/photo_{001..003}.jpg
$ tree
.
└── 2014
    └── 06
        └── 15
            ├── photo_001.jpg
            ├── photo_002.jpg
            └── photo_003.jpg

$ rename 's#(.+)/(.+)/(.+)#$1-$2-$3#' */*/*/
$ tree
.
├── 2014
│   └── 06
└── 2014-06-15
    ├── photo_001.jpg
    ├── photo_002.jpg
    └── photo_003.jpg

简单来说,它被输入到第三级目录,重命名是读取前两个段并重命名,将其粘贴在当前目录中。如您所见,将有大量年份目录。假设它们是空的,您可以使用类似以下内容进行清理(我祈祷您先检查它们是否为空):

find -maxdepth 1 -type d -regex '\./[0-9][0-9][0-9][0-9]' -exec rm -irf "{}" \;

我使用 -i 选项强制它在删除每个文件之前询问你。删除该选项需要你自担风险。

答案2

cd base
# the trailing slash in the pattern limits the results to directories, not files
for subdir in */*/*/; do
    # $subdir is now "year/mon/day/"
    subdir=${subdir%/}        # remove the trailing slash
    newdir=${subdir//\//-}    # replace all slashes with hyphens
    mkdir "$newdir"
    mv "$subdir"/* "$newdir"
done

答案3

尝试这个:

    TOP=$PWD
for y in *; do
  if cd $y; then
    for m in *; do
      if cd $m; then
           for d in *; do
          if cd $d; then
            mv $d $TOP/$y-$m-$d -R 
          fi
        done
        cd .. && rmdir $m
      fi
    done
    cd .. && rmdir $y
  fi
done

答案4

$ fn="/media/drive/folder/2014/06/14/name.jpg" ; \
回显“mv $fn $(echo $fn | sed -re 's,([0-9]+)/,\1-,g')”
mv /media/drive/folder/2014/06/14/name.jpg /media/drive/folder/2014-06-14-name.jpg
$ find -type f | tee LISTOFFILES.txt
$ cat LISTOFFILES.txt | while read p ; do # 依次循环所有文件
f="${p##*/}" ; bn=${f%%\.*};操作符="${p%/*}/" ;
echo -e "$f\n$bn\n$op"
# $p – 原始文件的完整路径
# $f – 带扩展名的文件名
# $bn - 基本名称,不带扩展名的文件名
# $op - 删除原始路径、文件名和扩展名

# 在此添加您的转换 - 基于上述内容
# mkdir -p "$p" # 可能需要
#mv“$p”“...”#
完毕

现在,如果您仔细阅读以上内容,您将找到完成此任务所需的所有信息。

因为我无法知道你是如何拥有它的,也无法知道你想要它什么——所以我无法替你完成它。

http://www.tldp.org/guides.html
有两个 Bash 指南可供阅读和浏览 - 尝试一下。

我把它留在这里。这是不是一项服务,我这样做纯粹是出于好奇。
请记住 - 其中可能存在错误,因为我尚未对其进行全面测试。
您可能会引入您没有想到的错误... :-)

祝你好运!;-) 你需要它。

相关内容