Bash 脚本,按文件内容将文件分类到文件夹;如何解决变量中的通配符? [英] Bash script which sorts files to folders by it's content; How to solve wildcard in variables?

查看:30
本文介绍了Bash 脚本,按文件内容将文件分类到文件夹;如何解决变量中的通配符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个小助手,将文件分类到不同的文件夹,但为什么呢?

I'm scripting a little helper that's sorts files to different folders, but why?

机械师:

在我的 linux suse 服务器上运行一个程序,该程序可以创建零到无限的文件,例如file.1.1",最后一个数字正在增加(file.1.1、file.1.2、file.1.3 等).在这个文件中是包含一个关键字的变量文本,在这个例子中是有水果的.每种水果都是一个订单,并由另一个脚本转换为电子邮件.问题是,另一个脚本获取所有文件并将它们全部转换为邮件,然后将它们发送给一个供应商.那不好.

On my linux suse server runs a programm that creates zero to unlimited files like "file.1.1" the last number is increasing (file.1.1, file.1.2, file.1.3, and so on). In this files is variable text which contains a keyword, in this example are there fruits. Each kind of fruit is a order and is converted by another script to a e-mail. The problem is, this other script take all files and convert all of them to a mail and send them to one supplier. That's not good.

所以我会将它们分类到不同的目录,以便将它们转换为正确供应商的邮件.

So I'll sort them to different directorys for converting them to mails for the correct supplier.

举个例子:

file.1.1 是苹果的订单,所以我的脚本搜索关键字apple".包含此文件apple",然后脚本将此文件移动到文件夹apple".如果没有,则将文件移动到正确的水果文件夹".

file.1.1 is an order for apples, so my script searches for the keyword "apple". Contains this file "apple", then the script move this file to the folder "apple". If not, then it move the file to the correct "fruit folder".

目录结构是这样的:

/home/me/sandbox/          <- here are all the files  
/home/me/sandbox/apple/    
/home/me/sandbox/strawberry/    
/home/me/sandbox/cherry/    
/home/me/sandbox/plum/

现在我的脚本:

#! /bin/bash -x

#Variablen Deklaration start
declare -a array;                               
array[key1]='strawberry'
array[key2]='apple'

VAR1="strawberry"
VAR2="apple"

XXSTRAWBERRY="/home/me/sandbox/strawberry/"
XXSTADTBIB="/home/me/sandbox/stadtbib/"
#Variablen Deklaration ende

find file.1.* > dateiliste.txt

for fn in `cat dateiliste.txt`; do
        for key1 in ${!array[@]}; do
            temp=$(find $fn | xargs grep $VAR1) #my problem
                if [ "$temp" = *"$VAR1"* ]; then
                   cp $fn $XXSTRAWBERRY
                else
                   cp $fn $XXAPPLES
                fi
        done
done

bash 输出是这样的:

The bash output is this:

me@server=test:~/sandbox > ./new\ \ 1.sh
+ declare -a array
+ array[key1]=strawberry
+ array[key2]=apple
+ VAR1=strawberry
+ VAR2=apple
+ ORTstrawberry=/home/me/sandbox/strawberry/
+ ORTapple=/home/me/sandbox/apple/
+ find file.1.1 file.1.2 file.1.3 file.1.4 file.1.5
++ cat dateiliste.txt
+ for fn in '`cat dateiliste.txt`'
+ for key1 in '${!array[@]}'
++ xargs grep strawberry
++ find file.1.1
+ temp=
+ '[' '' = '*"$VAR1"*' ']'
+ cp file.1.1 /home/me/sandbox/apple/
+ for fn in '`cat dateiliste.txt`'
+ for key1 in '${!array[@]}'
++ xargs grep strawberry
++ find file.1.2
+ temp='Bestellung fuer strawberry'
+ '[' 'Bestellung fuer strawberry' = '*"$VAR1"*' ']'
+ cp file.1.2 /home/me/sandbox/apple/
+ for fn in '`cat dateiliste.txt`'
+ for key1 in '${!array[@]}'
++ xargs grep strawberry
++ find file.1.3
+ temp=
+ '[' '' = '*"$VAR1"*' ']'
+ cp file.1.3 /home/me/sandbox/apple/
+ for fn in '`cat dateiliste.txt`'
+ for key1 in '${!array[@]}'
++ xargs grep strawberry
++ find file.1.4
+ temp='Bestellung fuer strawberry'
+ '[' 'Bestellung fuer strawberry' = '*"$VAR1"*' ']'
+ cp file.1.4 /home/me/sandbox/apple/
+ for fn in '`cat dateiliste.txt`'
+ for key1 in '${!array[@]}'
++ xargs grep strawberry
++ find file.1.5
+ temp=
+ '[' '' = '*"$VAR1"*' ']'
+ cp file.1.5 /home/me/sandbox/apple/

所以这就是我的问题.

文件内容很多,所以关键字并不孤单.使用我的临时变量$temp",我希望 grep 的输出带有正确的关键字.这是有效的,但为了平衡 $temp 中的 grep 输出和 $var1 中的关键字,我需要一个通配符.

The files contain a lot of content, so the keyword is not alone. With my temporary variable "$temp" I want the output from grep with the correct keyword. That works, but for the balance between the grep output in $temp and the keyword in $var1 I need a wildcard.

因此,如果 grep 输出 ($temp) 包含 apple ($var1),则移动(在示例中复制)file.1.* ($fn) 到 apple/($XXAPPLE).

So if the grep output ($temp) contains apple ($var1) then move (in the example copy) the file.1.* ($fn) to apple/ ($XXAPPLE).

我怎样才能轻松地意识到这一点?我在 bash 脚本方面没有太多经验

How can I realize this easily? I've not much experience in bash scripting

谢谢大家:)

推荐答案

#!/bin/bash 

#Variablen Deklaration start
declare -a fruits;                               
fruits=(strawberry apple banana)

ls file.1.* | while read f
do
    for fruit in "${fruits[@]}"; do
       grep -i $fruit "$f" >/dev/null 2>&1
       if [ $? -eq 0 ]; then
          echo Copying $f to $fruit
          cp "$f" $fruit
       fi
    done
done

这篇关于Bash 脚本,按文件内容将文件分类到文件夹;如何解决变量中的通配符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆