2014-01-14 25 views
1

我就在想,如果使用bash腳本可以不用手動複製每個是這樣的父目錄bash腳本複製某些類型的文件到另一個位置

"/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk 
/System/Library/PrivateFrameworks" 

所以這個文件夾PrivateFrameworks在文件中,也有很多子文件夾,並在每個子文件夾中包含我想將其複製到另一個位置的文件。因此該路徑的結構是這樣的:

-PrivateFrameworks 
    -AccessibilityUI.framework 
     -AccessibilityUI <- copy this 
    -AccountSettings.framework 
     -AccountSettings <- copy this 

我不想複製文件夾中的全部內容的選項,因此可能會出現文件夾包含我不想複製文件的情況。所以我想到的唯一方法是通過文件擴展名進行復制。但是,正如你所看到的,我指定用於複製的文件沒有擴展名(我認爲?)。我是bash腳本的新手,所以我不熟悉這是否可以用它來完成。

回答

2

要複製或不具有擴展當前目錄下的所有文件,可以使用:

find . ! -name '*.*' -exec cp -t /your/destination/dir/ {} + 

find .命令查找所有文件或當前目錄下。參數-name '*.*'將限制該搜索到具有擴展名的文件。然而,在前面加一個不是(!),我們會得到而不是的所有文件都有擴展名。然後,-exec cp -t /your/destination/dir/ {} +告訴find將這些文件複製到目的地。

要做到上述起始與長名稱的目錄,使用:

find "/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/PrivateFrameworks" ! -name '*.*' -exec cp -t /your/destination/dir/ {} + 

UPDATE:在這個問題上的UNIX標籤已被刪除,並用OSX標籤所取代。這意味着我們不能使用cp上的-t選項。解決方法是:

find . ! -name '*.*' -exec cp {} /your/destination/dir/ \; 

這是效率較低,因爲創建一個新的cp過程將會對每個文件移動,而不是一勞永逸適合在命令行上的文件。但是,它會完成同樣的事情。

更多:find命令的-exec子句有兩種變體。在上面的第一次使用中,該子句以{} +結尾,它告訴find用盡可能多的文件名填滿命令行的結尾。

但是,由於OSX缺少cp -t,所以我們必須將文件名放在命令的中間。所以,我們把{}放在我們想要文件名的地方,然後在find的地方發出exec命令結束的地方,我們添加一個分號。雖然有一個竅門。由於bash通常會使用分號本身,而不是將它傳遞給find,所以我們必須用反斜槓來分號。這樣bash將它發送給find命令。

+0

您好感謝您的幫助。但顯然我有非法選項時,我使用-t – user2541163

+0

@ user2541163行。 Macs沒有'cp -t'。查看解決方法的更新答案。 – John1024

+0

您好,非常感謝您的幫助。這個對我有用 :)。這個解釋也幫助我更好地理解。還有一個問題,與cp {}有什麼不同,我注意到末尾已被替換爲'\' – user2541163

0

sh SCRIPT.sh copy-from-directory .extension copy-to-directory

FROM_DIR=$1 
EXTENSION=$2 
TO_DIR=$3 

USAGE="""Usage: sh SCRIPT.sh copy-from-directory .extension copy-to-directory 

- EXAMPLE: sh SCRIPT.sh PrivateFrameworks .framework . 
- NOTE: 'copy-to-directory' argument is optional 
""" 

## print usage if less than 2 args 
if [[ $# < 2 ]]; then echo "${USAGE}" && exit 1 ; fi 

## set copy-to-dir default args 
if [[ -z "$TO_DIR" ]] ; then TO_DIR=$PWD ; fi 

## DO SOMETHING... 
## find directories; find target file; 
## copy target file to copy-to-dir if file exist 
find $FROM_DIR -type d | while read DIR ; do 
    FILE_TO_COPY=$(echo $DIR | xargs basename | sed "s/$EXTENSION//") 

    if [[ -f $DIR/$FILE_TO_COPY ]] ; then 
     cp $DIR/$FILE_TO_COPY $TO_DIR 
    fi 
done 
相關問題