2013-03-28 115 views
1

我需要製作一個具有2個參數的shell腳本,每個參數都是一個有效的目錄。該腳本在由第一個參數指定的第一個目錄中創建一個與第二個目錄同名的新目錄,並將第二個目錄的內容(包括子目錄和文件)複製到新創建的目錄中。但它只會複製帶有.txt擴展名的文件。用於克隆目錄的Shell腳本

這是我走到這一步:

#!/bin/bash 
if [ ! $# -eq 2 ] 
then echo usage: file.sh directory1 directory2 
    exit 1 
fi 
if [ ! -d $1 ] 
then echo $1 is not a directory \! 
    exit 1 
fi 

if [ ! -d $2 ] 
then echo $2 is not a directory \! 
    exit 1 
fi 
+2

'cp -a'?請參閱['cp'手冊](http://linux.die.net/man/1/cp)。 – 2013-03-28 10:20:04

+0

過濾器部分就是那個讓我煩惱的人 – 2013-03-28 10:21:13

+0

沒有過濾,只要執行'cp -a directory1 directory2',包括子目錄在內的所有東西都會被複制到'directory2'中。 – 2013-03-28 10:23:28

回答

1

離開調試的學生:

die() { echo >&2 "$*"; echo "Usage...."; exit 1; } 
from="$1"; 
to="$2"; 
[ ."$from" = . ] && die "from dir name missing"; 
[ ."$to" = . ] && die "to dir name missing"; 
[ -d "$from" ] || die "from dir $from not a directory"; 
[ -d "$to" ] || die "to dir $to not a directory"; 
target="$to/$(basname "$from")"; #final target dir name, if I understand you correctly. 
find "$from" -name '*.txt' -maxdepth=1 | cpio -pd "$to" || 
# (cd "$from" && find * -name '*.txt' -maxdepth=1 | cpio -o...) | (cd "$to" && cpio -i...) || 
    die "cpio failed" 

當心的cpio有許多選項,並使用它之前,你應該檢查他們。

註釋掉的技術可以讓你更自由地移動到替代目標目錄,我認爲你不需要這裏。

避免悲傷:總是引用文件名。

0

只需在您的腳本中添加此:

cp -dR $2 $1 
0

您可能需要使用rsync

例如一個更好的機會:

rsync -avz /dir1/ /dir2 
0

根據您對文件屬性保存的偏好,在cptarrsync的周圍存在許多單行備選方案。可以使用find命令獲得篩選。