BASH - 复制时忽略隐藏文件和空源目录

时间:2013-10-12 00:24:39

标签: linux bash unix cron

我是BASH的新手,我一直在使用cron job来处理这个脚本。我最初使用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,但我不知道这是不应该使用的。

有人能提供一个例子或指出我正确的方向吗?

3 个答案:

答案 0 :(得分:0)

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

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

现在添加cp

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

答案 1 :(得分:0)

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

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

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

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

(如果你想要删除点文件)。

答案 2 :(得分:0)

您可以使用正则表达式捕获所有隐藏的文件和文件夹,并使用!取消此操作。然后,您可以列出所有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