我有以下目錄結構:移動時追加,而不是覆蓋文件
+-archive
+-a
+-data.txt
+-b
+-data.txt
+-incoming
+-a
+-data.txt
+-c
+-data.txt
我該怎麼做的mv incoming/* archive/
等同,但有文件中incoming
附加到這些內容在archive
,而不是將其覆蓋?
我有以下目錄結構:移動時追加,而不是覆蓋文件
+-archive
+-a
+-data.txt
+-b
+-data.txt
+-incoming
+-a
+-data.txt
+-c
+-data.txt
我該怎麼做的mv incoming/* archive/
等同,但有文件中incoming
附加到這些內容在archive
,而不是將其覆蓋?
# 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
。
感謝您的回答(和歡迎)。它只是我正在尋找的東西。 – user303163 2010-03-27 20:23:31
這裏的適當引用一個版本:
#!/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
問題是,'basename'太少了。在傳入和存檔內部,似乎有一個重要的目錄結構。 – Boldewyn 2010-03-27 13:49:46
@Boldewyn - 已確認並修復。現在它使用Bash的正則表達式替換。 – amphetamachine 2010-03-29 01:56:02
您沒有在任何地方設置'in_file',並且缺少for語句中的美元符號。 – 2010-03-29 14:03:44
當前目錄運行它。
find ./incoming -type f | while read -r FILE
do
dest=${FILE/incoming/archive}
cat "$FILE" >> "$dest"
done
一個在incoming/c
不會被追加但
您好,ukas1,歡迎StackOverflow上。很高興看到有人在他/她的第一個問題中正確使用markdown語法。 – Boldewyn 2010-03-27 13:32:01