我是一名摄影师,在一个文件夹中有多个衣服的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和";uniq
ued"> - 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"
}