繁体   English   中英

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

[英]Bash script to scan sub-directories and copy contents of file to another file

我需要执行一个bash命令,该命令将浏览系统上的每个主目录,并将.forward文件的内容复制到一个文件中,并复制刚从中复制的目录的名称。 因此,例如,最终文件将是诸如forwards.txt之类的内容,listeings将是

/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

谢谢。

您的脚本有正确的版本:

#!/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文件,而不是主目录本身是否存在

  • 在每次迭代中, $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

我会写

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

一个衬板(已更正):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM