1

当我拍摄肖像时,我会用照片中人物的姓名首字母来命名。例如,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

但是我有很多图片要和很多不同的人一起浏览,而且当我完成后,我必须手动删除它们,确认我在命名时没有搞砸,所以它没有匹配.

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

编辑:我意识到在给定的示例中不需要正则表达式,但在其中一些示例中,我在命名时变得快速而粗心并出现错误,因此使用正则表达式更容易一次捕获所有这些,甚至错别字。显然,在这种情况下,正则表达式更大。这是一个示例,名称再次编辑为 Daniel Fortner,其中他们是唯一的主题。

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

1 回答 1

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
于 2013-08-07T04:33:40.900 回答