【问题标题】:BASH - ignore hidden files and empty source directory when copyingBASH - 复制时忽略隐藏文件和空源目录
【发布时间】:2013-10-20 04:22:36
【问题描述】:

我是 BASH 的新手,我一直在使用这个带有 cron 作业的脚本。我遇到了一些麻烦,最初使用mv,但事实证明它不会与匹配的目录或任何东西合并。所以我被建议使用cp,因为据说它会合并和替换。

/schedule/ = 源目录 /public_html/ = 目标目录

#!/bin/bash

[ignore dot files/hidden files when copying]
cp -a schedule/* public_html/
[empty contents of source directory(schedule/) after copying]

来源:/schedule/(包含文件夹/文件)

/files/
--4.html
--5.html
/assets/
--sitemap.xml

目标:/public_html/(之前的文件夹已经存在)

/files/
--1.html
--2.html
--3.html
/assets/
--sitemap.xml

最终,我试图找出如何在使用cp 时忽略隐藏文件,并在复制后清空源目录。我正在阅读 BASH 参考手册,看到了nullglob,但我不知道是否应该使用它。

谁能提供一个例子或指出正确的方向?

【问题讨论】:

  • 是的,rsync 有一个可以过滤隐藏文件的--exclude 选项和一个可以过滤空目录的--prune-empty-dirs 选项。

标签: linux bash unix cron


【解决方案1】:

您可以使用find command列出所有非隐藏文件和非空目录:

find /schedule -not -path '*/\.*' -not -empty

现在添加cp

find /schedule -not -path '*/\.*' -not -empty -exec cp -a '{}' /public_html/ \;

【讨论】:

    【解决方案2】:

    使用您的命令cp -a schedule/* public_html/,您已经完成了任务的第一部分[复制时忽略点文件],因为路径名扩展会忽略以“.”开头的文件名,如果 GLOBIGNORE 变量和 dotglob 选项未设置 - 您可以unset GLOBIGNORE 确保这一点。

    对于第二部分[复制后清空源目录]只需附加rm命令:

    cp -a schedule/* public_html && rm -r schedule/*
    

    cp -a schedule/* public_html && rm -r schedule/{,.[!.]}*
    

    (如果您也希望删除点文件)。

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式来捕获所有隐藏的文件和文件夹,并使用! 来否定它。然后,您可以列出所有 FILES 并复制和删除文件。

      FILES=$(find /PATH/TO/SOURCE/FOLDER \( ! -regex '.*/\..*' \) -type f ) 
      for f in $FILES; 
      do 
       cp /PATH/TO/SOURCE/FOLDER/$f /PATH/TO/DEST/FOLDER/$f;
       rm /PATH/TO/SOURCE/FOLDER/$f
      done
      

      您也可以使用mv 代替cprm

      【讨论】:

      • 将文件名捕获到字符串中存在一个已充分证明的问题,即它无法与包含 shell 元字符的文件名正常工作。您可以改用数组,但要正确处理仍然很棘手。我可能会选择find ... -exec sh -c 'cp "$@" /path/to/dest/ || rm "$@"' _ {} +,尽管这取决于find 支持+-exec
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2021-01-23
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      相关资源
      最近更新 更多