根据文件名对目录中的文件进行排序

根据文件名对目录中的文件进行排序

我在一个目录中的科学档案中扫描了超过 35,000 个诊断阳性。 (幸运的是,文件名的格式相当统一:{year}-{place}-{film-#}-{photo-#} OR {year}-{year}-{place}-{film-#}-{photo-#}。)

我想通过regex/awk命名{year}-{place}OR创建目录{year}-{year}-{place},然后我想将相应的照片移动到这些目录中。

我知道这些帖子涉及非常相似的问题,但我无法进行“转移”:

有几个问题,但我认为最大的一个是我无法让正则表达式工作(尽管它们工作得很好regex101.com并且我逃脱了(,|))。即使我可以让它们工作,awk似乎也不支持其他正则表达式组。

非常感谢任何帮助=)

显示我的正则表达式问题的非工作示例:

#!/bin/bash

regex='\([0-9]*-[0-9]*\|[0-9]*\)-[a-zA-Z]*'
liste='1975-Bali.jpg'
echo $liste
[[$liste=~$regex]]

echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"

给出:

1975-Bali.jpg
./ALT_ordner_erstellen.sh: line 8: [[1975-Bali.jpg=~\([0-9]*-[0-9]*\|[0-9]*\)-[a-zA-Z]*]]: command not found

编辑:

正如 Paul_Pedant 评论的那样:这是我对脚本结构的想法,用伪代码表示:

loop begin
    # via awk or sed?
    for every filename 
         mkdir based on {year}-{place} or {year}-{year}-place
         mv corresponding files to directory
loop end

mkdir 可以选择不创建已存在的目录,对吗?因为否则我上述在一个循环中完成所有操作的想法就不是很聪明,因为许多照片应该放在一个目录中,每次重新创建它都会丢失已经移动的照片,对吗?

文件名示例:

1980-1981-Bali-055-21a.jpg  
1980-1981-Bali-055-21.jpg  
1980-1981-Bali-055a-21.jpg  
1980-Bali-055-21.jpg  
1980-Bali-055a-21.jpg

我还考虑过不要从一开始就搜索文件名,因为肯定可以有“year-year-place-film-photo”和“year-place-film-photo”,但从最后开始,请参阅以下代码片段:

echo "1980-Bali-055a-028.jpg" | sed -e "s/-[0-9a-zA-Z]*-[0-9]*.jpg$//"

但我不能 100% 确定 film-photo.jpg 总是(!)文件名的结尾,有很多,而且我没有扫描正片。

感谢您的输入!

答案1

zsh

zmodload zsh/files
autoload -Uz zmv
mkmv() { mkdir -p -- "$2:h" && mv -- "$@"; }
zmv -n -P mkmv '(<1600-2020>(-<1600-2020>|)-[^0-9-][^-]#)*(#q.)' '$1/$f'

当满意它能达到您想要的效果时,将其删除-n(试运行)。

zmodload zsh/files是 makemkdirmv内置的,以加快速度,因为您有数千个文件需要重命名,这意味着对mkdir和的调用同样多mv)。

相关内容