当我拍摄肖像时,我会用他们中的人物首字母命名。例如,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
答案 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