开发者

Appending rather than overwriting files when moving

I have the following directory structure:

+-arc开发者_StackOverflow中文版hive
  +-a
    +-data.txt
  +-b
    +-data.txt 
+-incoming
  +-a
    +-data.txt
  +-c
    +-data.txt

How do I do the equivalent of mv incoming/* archive/ but have the contents of the files in incoming appended to those in archive rather than overwrite them?


# 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

This should find any file in incoming and concatenate it to an existing file in archive.

The important part is to be inside incoming, because else we'd had to strip the path prefix (which is possible, but in the above case unnecessary). In the above case, a value of $f typically looks like ./a/data.txt, and hence the redirection goes to ../archive/./a/data.txt.


run it on the current directory.

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

the one in incoming/c would not be appended though


Here's a version with proper quoting:

#!/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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜