Automator/Apple脚本:在新文件夹中移动具有相同前缀的文件.文件夹名称必须是文件前缀



我是一名摄影师,在一个文件夹中有多个衣服的jpg文件。文件名结构为:

TYPE_FABRIC_COLOR(例如:BU23W02CA_CU_RED、BU23W02CA_BUE、BU23W23MG_LINO_WHITE(

我必须在一个名为TYPE的文件夹上移动相同TYPE(BU23W02CA(的文件。

例如:

主文件夹>

BU23W02CCA_CNU_RED.jpg、BU23W02cCA_CNU_BLUE.jpg、BU23W23MG_LINO_WHITE.jpg

成为:

主文件夹>

BU23W02CCA_CNU>BU23W02CCA_CNU_RED.jpg、BU23W02cCA_CNU_BLUE.jpg

BU23W23MG_LINO>BU23W23MG_LINO_WHITE.jpg

以下是一些脚本。

V1

#!/bin/bash
find . -maxdepth 1 -type f -name "*.jpg" -print0 | while IFS= read -r -d '' file
do
# Extract the directory name
dirname=$(echo "$file" | cut -d'_' -f1-2 | sed 's#./(.*)#1#')
#DEBUG echo "$file --> $dirname"
# Create it if not already existing
if [[ ! -d "$dirname" ]]
then
mkdir "$dirname"
fi
# Move the file into it
mv "$file" "$dirname"
done
  • 它假设find列出的所有文件都是您在问题中描述的格式,即TYPE_FABRIC_COLOR.ext
  • dirname是对文件名中由_分隔的前两个单词的提取
  • 由于find列出了带有./前缀的文件,因此它也会从dirname中删除(这就是sed命令的作用(
  • CCD_ 9指定要考虑为CCD_。如果您想限制移动中要考虑的文件,可以将其更改为其他内容
  • 这个版本循环遍历每个文件,创建一个包含前两个部分的目录(如果它还不存在(,并将文件移到其中
  • 如果要查看脚本对每个文件所做的操作,可以将选项-v添加到mv命令中。我用它来调试

但是,由于它逐个循环遍历每个文件,因此这可能需要大量文件的时间,因此是下一个版本。


V2

#!/bin/bash
while IFS= read -r dirname
do
echo ">$dirname"
# Create it if not already existing
if [[ ! -d "$dirname" ]]
then
mkdir "$dirname"
fi
# Move the file into it
find . -maxdepth 1 -type f -name "${dirname}_*" -exec mv {} "$dirname" ;
done < <(find . -maxdepth 1 -type f -name "*.jpg" -print | sed 's#^./(.*)_(.*)_.*..*$#1_2#' | sort | uniq)
  • 这个版本在目录名上循环,而不是在每个文件上循环
  • 最后一行执行";魔术";。它find会清空所有文件,并立即提取前两个单词(使用sed(。则这些字是CCD_ 15ed和";uniqued">
  • CCD_ 17循环然后逐个创建每个目录
  • while循环中的find将所有与正在处理的目录匹配的文件移到其中。为什么我不简单地执行mv ${dirname}_* ${dirname}?由于扩展*通配符可能会导致mv命令的参数列表过长。使用find可以确保它甚至可以处理大量文件

建议使用onelinerawk脚本:

echo "$(ls -1 *.jpg)"| awk '{system("mkdir -p "$1 OFS $2);system("mv "$0" "$1 OFS $2)}' FS=_ OFS=_

说明:

echo "$(ls -1 *.jpg)":列出当前目录中的所有jpg文件,每行一个文件

FS=_:将awk字段分隔符设置为_$1=类型$2=结构$3=颜色.jpg

OFS=_:将awk输出字段分隔符设置为_

awk脚本解释

{ # for each file name from list
system ("mkdir -p "$1 OFS $2); # execute "mkdir -p type_fabric"
system ("mv " $0 " " $1 OFS $2); # execute "mv current-file to type_fabric"
}

最新更新