我有以下目录结构:

+-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

关于linux - 移动时附加而不是覆盖文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2529391/

10-13 04:30