【问题标题】:BASH: iterating through a directory excluding certain keyword-based subdirectoriesBASH:遍历一个目录,不包括某些基于关键字的子目录
【发布时间】:2012-02-21 19:49:40
【问题描述】:

我正在尝试创建一个简单的备份脚本,其中包括复制我的 firefox 配置文件,不包括该配置文件中的任何缓存项或文件夹。

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

这听起来很简单,但我是 bash 脚本的新手,到目前为止我想出的东西太不优雅和笨拙,我很想得到一些意见。

这是我目前所拥有的:

#!/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

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

那么...有什么提示可以帮助我吗?

【问题讨论】:

  • 你要找的技术是recursion

标签: linux bash debian-based


【解决方案1】:

这份工作最好留给rsync

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

【讨论】:

  • 这看起来可能是我的票,但我尝试运行它并遇到一个(大)问题:它仍在复制缓存文件夹。在 ?.default 文件夹中,大约有 3 个此类配置文件文件夹:OfflineCache、startupCache、...
  • @Zaan:您必须指定多个 --exclude= 选项,或者找到与所有文件夹名称匹配的通配符模式 (--exclude='*Cache/')。您问题中发布的代码仅过滤了"Cache",因此我使 rsync 命令的行为方式相同
【解决方案2】:

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

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

看到你喜欢的东西后,拿出echo。您可能想通过谷歌搜索更多示例,可能是xargs。如果您的cp-t 选项,还请查看find -exec 文档中的\+

【讨论】:

  • 这会找到名为 Cache 的文件。它不排除名称为 Cache 的目录(OP 要求的)
  • 感谢您的留言,添加了缺失的-prune
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多