gpt4 book ai didi

regex - 如何移动多个不同目录中的多个文件(在 Linux 上)

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:39 26 4
gpt4 key购买 nike

我的问题是我在单个目录中有太多文件。我不能“ls”这个目录,因为它太大了。我需要将所有文件移动到更好的目录结构中。

我以相反的方式使用 ID 的最后 3 位数字作为文件夹。

例如 ID 2018972 将进入 /2/7/9/img_2018972.jpg

我已经创建了目录,但现在我需要有关 bash 脚本的帮助。我知道 ID,范围是 1,300,000 - 2,000,000。但我无法处理正则表达式。

我不想像这样移动所有文件:

/images/folder/img_2018972.jpg -> /images/2/7/9/img_2018972.jpg

对于此主题的任何帮助,我将不胜感激。谢谢!

最佳答案

编辑:在评论中进行解释后,存在以下假设:

  • 文件名格式为img_<id>.jpgimg_<id>_<size>.jpg
  • 新目录是id的最后三位数字的倒序

使用 Bash:

for file in /images/folder/*.jpg; do 
fname="${file%.*}" # remove extension and _<size>
[[ "$fname" =~ img_[0-9]+_[0-9]+$ ]] && fname="${fname%_*}"

last0="${fname: -1:1}" # last letter/digit
last1="${fname: -2:1}" # last but one letter/digit
last2="${fname: -3:1}" # last but two letter/digit

newdir="/images/$last0/$last1/$last2"
# optionally check if the new dir exists, if not create it
[[ -d "$newdir" ]] || mkdir -p "$newdir"

mv "$file" "$newdir"
done

如果*无法处理它(尽管我认为 for 循环中的 * 没有限制),
使用 find正如@Michał Kosmulski 在评论中所建议的那样

while read -r; do 
fname="${REPLY%.*}" # remove extension and _<size>
[[ "$fname" =~ img_[0-9]+_[0-9]+$ ]] && fname="${fname%_*}"

last0="${fname: -1:1}" # last letter/digit
last1="${fname: -2:1}" # last but one letter/digit
last2="${fname: -3:1}" # last but two letter/digit

newdir="/images/$last0/$last1/$last2"
# optionally check if the new dir exists, if not create it
[[ -d "$newdir" ]] || mkdir -p "$newdir"

mv "$REPLY" "$newdir"
done < <(find /images/folder/ -maxdepth 1 -type f -name "*.jpg")

关于regex - 如何移动多个不同目录中的多个文件(在 Linux 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com