2010-03-27 43 views
3

我有以下目錄結構:移動時追加,而不是覆蓋文件

+-archive 
    +-a 
    +-data.txt 
    +-b 
    +-data.txt 
+-incoming 
    +-a 
    +-data.txt 
    +-c 
    +-data.txt 

我該怎麼做的mv incoming/* archive/等同,但有文件中incoming附加到這些內容在archive,而不是將其覆蓋?

+3

您好,ukas1,歡迎StackOverflow上。很高興看到有人在他/她的第一個問題中正確使用markdown語法。 – Boldewyn 2010-03-27 13:32:01

回答

2
# move to incoming/ so that we don't 
# need to strip a path prefix 
cd incoming 

# create directories that are missing in archive 
for d in `find . -type d`; do 
    if [ ! -d "../archive/$d" ]; then 
    mkdir -p "../archive/$d" 
    fi 
done 

# concatenate all files to already existing 
# ones (or automatically create them) 
for f in `find . -type f`; do 
    cat "$f" >> "../archive/$f" 
done 

這應該找到任何文件中incoming並串聯到現有的文件中archive

最重要的部分是成爲內部incoming,因爲否則我們就必須剝除路徑前綴(這是可能的,但在上述情況下是不必要的)。在上述情況下,$f的值通常看起來像./a/data.txt,因此重定向將轉至../archive/./a/data.txt

+0

感謝您的回答(和歡迎)。它只是我正在尋找的東西。 – user303163 2010-03-27 20:23:31

0

這裏的適當引用一個版本:

#!/bin/sh 
if [ -z "$1" ]; then 
    # acting as parent script 
    find incoming -type f -exec "$0" {} \; 
else 
    # acting as child script 
    for in_file; do 
     if [ -f "$in_file" ]; then 
      destfile="${in_file/incoming/archive}" 
      test -d "$(dirname "$destfile")" || mkdir -p "$_" 
      cat "$in_file" >> "$destfile" && 
      rm -f "$in_file" 
     fi 
    done 
fi 
+0

問題是,'basename'太少了。在傳入和存檔內部,似乎有一個重要的目錄結構。 – Boldewyn 2010-03-27 13:49:46

+0

@Boldewyn - 已確認並修復。現在它使用Bash的正則表達式替換。 – amphetamachine 2010-03-29 01:56:02

+0

您沒有在任何地方設置'in_file',並且缺少for語句中的美元符號。 – 2010-03-29 14:03:44

0

當前目錄運行它。

find ./incoming -type f | while read -r FILE 
do 
    dest=${FILE/incoming/archive} 
    cat "$FILE" >> "$dest" 
done 

一個在incoming/c不會被追加但

相關問題