BASH:遍历一个目录,不包括某些基于关键字的子目录

时间:2012-02-21 19:49:41

标签: linux bash debian-based

我正在尝试创建一个简单的备份脚本,除其他外,将复制我的firefox配置文件,排除该配置文件中的任何缓存项目或文件夹。

这是我的基于debian的crunchbang系统。

这听起来很简单,但我是新手来编写脚本,到目前为止我提出的内容是如此不优雅和笨拙以至于我不想得到一些意见。

这是我到目前为止所拥有的:

#!/bin/bash

for f in /home/my_name/.mozilla/firefox/*.default/*
do
echo "$f level 1"

if [[ "$f" != "Cache" ]]
then
    if [ -d $f ]
    then
        for g in $f/?
        do
           echo "$g level 2"
            for h in $g/?
            do
            echo "$h level 3"
                for i in $h/?
                do
                echo "$i level 4"
                for j in $i/?
                do
                echo "$j level 5"
                done
            done
        done
    done 
    fi
fi
done

您可能已经猜到了回音,以便进行错误检查。这些将由cp语句替换。

我看到的一个问题是这不够灵活:如果有超过5的目录,则不会包含它们。如果我扩展脚本以包含它们,我只需将问题移一步。

另一个问题是我目前在脚本输出中看到的问题:

/home/my_name/.mozilla/firefox/gibberish.default/OfflineCache/?/?/? level 4

我不知道为什么会出现这条线,但我相信它不应该出现。

那么......在我的路上有什么提示可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

这项工作最好留给rsync

rsync -avh --progress --exclude='*Cache/' ~/.mozilla/firefox/ /path/to/your/backup/location/

答案 1 :(得分:1)

递归目录结构的标准工具是find

find /home/my_name/.mozilla/firefox/*.default/* -name Cache -prune -o -type f -exec echo cp {} dest \;

一旦看到自己喜欢的内容,请取出echo。您可能需要谷歌搜索其他示例,可能是xargs。如果您的cp-t选项,请查看\+文档中的find -exec