2013-10-12 56 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