2015-09-07 41 views
0

是否有某種方法可以使用bash腳本複製包括內容的目錄。例如Bash複製所有包含匹配模式的內容的目錄

// Suppose there are many directory inside Test in c as, 
    /media/test/ 
     -- en_US 
       -- file1 
       -- file 2 
     -- de_DE 
       -- file 1 
       -- SUB-dir1 
        -- sub file 1 
       -- file 2 
       ..... 
       ..... 
     -- Test 1 
       -- testfile1 
       -- folder 
        --- more 1 
     ............ 

NoW i want to copy all the directories (including sub-directory and files) 
to another location which matches the pattern. 
--> for example , in above case I want the directories en_US and de_DE to be copied in another 
location including sub-directories and files. 

到目前爲止,我已經做了/找出:

1)所需模式爲,/b/w{2}_/w{2}/b

2)我可以列出所有的目錄作爲,

$MYDIR="/media/test/" 
DIRS=`ls -l $MYDIR | egrep '^d' | awk '{print $10}'` 
for DIR in $DIRS 
do 
echo ${DIR} 
done 

現在我需要將這些組合在一起的幫助,以便腳本可以將與​​模式匹配的所有目錄(包括子內容)複製到另一個位置。

在此先感謝。

+0

我只是不明白你打算如何將這兩樣東西放在一起給出明智的結果。但是,從我對相關內容的有限解釋中可以看出,你可以看看命令'ls -aR1。/ directory_name',它將爲您提供一個目錄內的完整列表 –

+1

bash是一個UNIX shell。 UNIX沒有'文件夾',它有'目錄',而UNIX路徑不是用'\'反斜槓分隔的,它們被正斜線'/'分開。這聽起來像你想要的UNIX命令只是'cp -r olddir newdir'。 –

+0

@EdMorton:我確實改變了結構。以及如果目錄已知,那麼只需將所有需要的目錄複製到新位置可能會更容易。但情況是,可能有1000個結構爲ex的文件夾。 'aa_bb'即2個字符,然後再次強調兩個字符。我需要找到並將這種格式的所有目錄複製到新的位置。 – Nepal12

回答

2

到整個目錄結構,有選擇地複製到類似的目錄結構,同時過濾的內容,最好的辦法是到存檔的原始目錄和取消存檔的通用方法。例如,使用GNU焦油:

$ mkdir destdir 
$ tar -c /media/test/{en_US,de_DE} | tar -C destdir -x --strip-components=1 

在這個例子中,/media/test目錄結構被部分destdir下重新創建,但不包括/media前綴(感謝--strip-components=1)。

左側tar僅存檔與我們指定的模式相匹配的目錄/路徑。該檔案是在該命令的標準輸出上生成的,該輸出被傳送到右側的解碼tar-C指示它更改爲目標目錄。它在那裏提取文件,刪除前導路徑組件。

$ ls destdir 
test 
$ ls destdir/test 
en_US de_DE 

當然,你的具體實例的測試情況下很容易與cp -a處理:

$ mkdir destdir 
$ cp -a /media/test/{en_US,de_DE} destdir 

如果模式很複雜,更深和/或不同層次的涉及子樹材料的多種選擇源目錄層次結構,那麼如果您希望在僅指定源模式的單個批處理命令中進行復制,則需要更通用的方法。

2

我不知道你的環境,但我猜你試着這樣做:

cp -r src_dir/??_?? dest_dir 
-1

請檢查,如果這是你想要的。它搜索格式爲xx_yy/ab_cd/& & _ $$(2char_2char)的目錄,並將內容複製到新目錄。

usage : ./script.sh 

cat script.sh 

#!/bin/bash 

MYDIR="/media/test/" 
NEWDIRPATH="/media/test_new" 
DIRS=`ls -l $MYDIR | grep "^d" | awk '{print $9}'` 
for DIR in $DIRS 
do 
     total_characters=`echo $DIR | wc -m` 
     if [ $total_characters -eq 6 ]; then 
       has_underscore=`echo "$DIR" | grep "_"` 
       if [ "$has_underscore" != "" ]; then 
         echo "${DIR}" 
         start_string_count=`echo $DIR | awk -F '_' '{print $1}' | wc -m` 
         end_string_count=`echo $DIR | awk -F '_' '{print $2}' | wc -m` 
         echo "start_string_count => $start_string_count ; end_string_count => $end_string_count" 
         if [ $start_string_count -eq 3 ] && [ $end_string_count -eq 3 ]; then 
           mkdir -p $NEWDIRPATH/"$DIR"_new 
           cp -r $DIR $NEWDIRPATH/"$DIR"_new 
         fi 
       fi 
     fi 
done 
1

這是您的首發10:
您將不得不添加所需的額外支票和餘額,但它應該給你一個飛行的開始。

#!/bin/bash 
# assumes $1 is source to search and $2 to destination to copy to 
subdirs=`find $1 -name ??_?? -print` 
echo $subdirs 
for x in $subdirs 
do 
     echo $x 
     cp -a $x $2 
done 
+0

請注意,我刪除了位於'$ subdirs'的'for x'末尾的:(冒號),因爲這會導致在通過將冒號添加到文件末尾而生成的任何列表的最後一行上出現錯誤名稱 –

相關問題