![将目录结构从 /YEAR/MONTH/DAY/ 更改为 /YEAR-MONTH-DAY](https://linux22.com/image/1046864/%E5%B0%86%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E4%BB%8E%20%2FYEAR%2FMONTH%2FDAY%2F%20%E6%9B%B4%E6%94%B9%E4%B8%BA%20%2FYEAR-MONTH-DAY.png)
我需要将我的照片目录结构从 /YEAR/MONTH/DAY/ 更改为 /YEAR-MONTH-DAY
我知道这可以用 来完成exiftool
,但它只适用于包含 EXIF 标签的文件,我有与每张图片相对应的 xmp-sidecar 文件,这些文件也需要一起提供。所以我认为某种脚本是最好的方法。
我坐下来尝试学习 RegEx、sed
bash 等等,如果有足够的时间,我想我应该能够解决这个问题,但现在我很着急,所以任何帮助都将不胜感激。
//奥拉
答案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 指南可供阅读和浏览 - 尝试一下。
我把它留在这里。这是不是一项服务,我这样做纯粹是出于好奇。
请记住 - 其中可能存在错误,因为我尚未对其进行全面测试。
您可能会引入您没有想到的错误... :-)
祝你好运!;-) 你需要它。