按名称排序图像

时间:2013-08-06 02:43:45

标签: regex bash sorting

当我拍摄肖像时,我会用他们中的人物首字母命名。例如,Robert Gordon的第一张照片是(正则表达式格式化)rg.(dng|tiff?|jpe?g|ps(d|b)|xcf)。下一个是rg2...,依此类推。

如果我需要将它们分类到文件夹中,我使用它:

mkdir <initials>/
mv <initials>*.* !$

但是最近,我需要将大量照片分类到包含多个主题的文件夹中,所以我使用了这个(首字母是df的例子:

for f in *.*; do
  if echo "$f" | grep -i *df*.*; then
    cp -n "$f" df/
    echo "$f"
  fi
done

但我有一个 很多 的图片可以通过不同的人的 很多 来完成我完成了,我必须手动删除它们,确认我在命名时没有搞砸,以致它没有得到匹配。

有没有办法可以将扩展前的所有内容分成两个字母组,然后将图像复制到匹配的文件夹中,并在完成后将其删除?

编辑:我意识到在给定的例子中没有必要使用正则表达式,但是在其中一些中,我在命名时遇到了快速而粗心的错误,所以使用正则表达式来捕获所有这些表达式更容易曾经,甚至是错别字。显然,在这种情况下,正则表达式更大。这是一个例子,名字再次编辑给丹尼尔·福特纳,他们是唯一的主题。

for f in *.*; do
  if echo "$f" | grep -Eq '^df?([0-9]*)?(hr)?\..*$'; then
    mv "$f" df/
    echo "$f"
  fi
done

1 个答案:

答案 0 :(得分:1)

利用bash [[的正则表达式匹配以及$BASH_REMATCH的后续设置。

#!/bin/bash
for file in *.*
do
  [[ $file =~ .*([[:alpha:]]{2})([[:digit:]]*)\.[^.]+ ]] || continue
  mkdir "${BASH_REMATCH[1]}" &> /dev/null
  mv -v "$file" "${BASH_REMATCH[1]}"
done