![根据文件名对目录中的文件进行排序](https://linux22.com/image/179602/%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E5%90%8D%E5%AF%B9%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F.png)
我在一个目录中的科学档案中扫描了超过 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
是 makemkdir
和mv
内置的,以加快速度,因为您有数千个文件需要重命名,这意味着对mkdir
和的调用同样多mv
)。