2013-10-12 55 views
1

我是BASH的新手,我一直在使用cron作业来处理这个脚本。我遇到了一些麻烦,最初使用mv,但事实证明它不会与匹配的目录或任何东西进行合并。所以我被建议使用cp,因为这将被合并和替换。BASH - 复制时忽略隐藏文件和空源目录

/时间表/ =源目录 /的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 

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

任何人都可以提供一个例子或指向正确的方向吗?

+1

尝试'rsync' .... –

+1

是的,'rsync'有一个可以过滤隐藏文件的'--exclude'选项和一个'--prune-empty-dirs'选项,可以过滤掉空白的dirs。 – SaltyEgg

回答

0

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

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

现在添加cp

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

在命令中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/{,.[!.]}* 

(如果你想点文件被删除以及) 。

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