我是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
,但我不知道这是不应该使用的。
有人能提供一个例子或指出我正确的方向吗?
答案 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
代替cp
和rm
。