Bash脚本扫描子目录并将文件内容复制到另一个文件

时间:2014-01-29 20:18:21

标签: bash shell ksh

我需要执行一个bash命令来查看系统上的每个主目录,并将.forward文件的内容复制到一个文件中,同时复制它刚才复制的目录的名称。因此,例如,最终文件将类似于forwards.txt,并且侦听将是

/home/user1
user1@email.com
/home/user2
user2@email.com

我用这个将它们列为屏幕。

find /home -name '*' | cat /home/*/.forward

它将在每个文件中打印出转发但我没有让它以它来自哪个主目录作为前缀。我需要使用循环来执行此操作吗?我有这个测试循环,

#!/bin/bash
for i in /home/*
        do
                if [ -d $i ]
                        then
                                pwd >> /tmp/forwards.txt
                                cat /home/*/.forward >> /tmp/forwards.txt
                fi
        done

但它在我的测试设置中经历了四个主目录,并且forwards.txt文件列出了以下四次。

/tmp
user1@email.com
user2@email.com
user3@email.com
user3@email.com

感谢。

3 个答案:

答案 0 :(得分:1)

您的脚本有更正版本:

#!/bin/bash
for i in /home/*
        do
                if [ -f "$i/.forward" ]
                then
                                echo "$i" >> /tmp/forwards.txt
                                cat "$i/.forward" >> /tmp/forwards.txt
                fi
        done

有些观点:

  • 我们检查主目录中的.forward文件的礼物,而不是主目录本身的存在

  • 每次迭代{li>

    $i包含主目录的名称(如/home/user1)。所以我们使用它的值而不是pwd命令的输出,它始终返回当前目录(在我们的情况下它不会改变)

  • 而不是/home/*/.forward我们使用"/home/$i/.forward",因为替换后*会向我们提供所有目录,而我们只需要当前


此脚本的另一个最短版本可能如下所示:

find /home -type f -name '.forward' | while read F; do
    dirname "$F" >>/tmp/forwards.txt
    cat "$F" >>/tmp/forwards.txt
done

答案 1 :(得分:1)

我会写

for fwd in /home/*/.forward; do
    dirname "$fwd"
    cat "$fwd"
done > forwards.txt

答案 2 :(得分:0)

一个班轮(已更正):

find /home -maxdepth 2 -name ".forward" -exec echo "{}" >> /tmp/forwards.txt \; -exec cat "{}" >> /tmp/forwards.txt \;

这将输出:

/home/user1/.forward
a@a.a
b@b.b
/home/user2/.forward
a@b.c