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

查看:44
本文介绍了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),则将文件(在示例副本中)移动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天全站免登陆