【问题标题】:Appending rather than overwriting files when moving移动时附加而不是覆盖文件
【发布时间】:2010-03-27 13:17:24
【问题描述】:

我的目录结构如下:

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

我如何做与mv incoming/* archive/ 等效的操作,但将incoming 中的文件内容附加到archive 中的内容而不是覆盖它们?

【问题讨论】:

  • 你好,ukas1,欢迎来到 StackOverflow。很高兴看到有人在他/她的第一个问题中正确使用了 markdown 语法。

标签: linux bash command-line


【解决方案1】:
# 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 中的现有文件。

重要的部分是inside incoming,因为否则我们必须去掉路径前缀(这是可能的,但在上述情况下是不必要的)。在上述情况下,$f 的值通常看起来像 ./a/data.txt,因此重定向到 ../archive/./a/data.txt

【讨论】:

  • 感谢您的回答(和欢迎)。它正是我想要的。
【解决方案2】:

在当前目录运行它。

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

incoming/c 中的那个不会被追加

【讨论】:

    【解决方案3】:

    这是一个正确引用的版本:

    #!/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 - 已确认并已修复。现在它使用 Bash 的正则表达式替换。
    • 您没有在任何地方设置 in_file 并且它在 for 语句中缺少一个美元符号。
    • @Dennis - 这是正确的语法。 for in_file; do 只是 for in_file in "$@"; do 的简写,它将循环遍历脚本的所有参数,将变量 $in_file 设置为当前参数。在 for 语句中使用美元符号是不正确的语法......也许是时候阅读 BASH 语法了。
    • 你是对的。我忘记了那个功能。我只是发现明确地引用"$@" 更具可读性。也许可读性是一个有效的目标。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2013-02-09
    • 2018-09-15
    • 2012-06-18
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多