首页 > 解决方案 > 使用 find 和 cat 复制多个文件的内容

问题描述

亲爱的,

我尝试在 bash 脚本中结合使用“find”和“cat”来复制子目录中数百个文件的内容:

find ./inlet3/* -type f -name 'U' -exec bash -c 'cat "{}"' \; > temp -exec bash -c 'cat temp >> "{}"' \;

查看给定的命令,我打算首先将每个“U”的内容复制到一个名为“temp”的临时文件中,该文件应该每次都在 bash 脚本所在的目录中创建。这部分应通过以下方法实现:

-exec bash -c 'cat "{}"' \; > temp

“temp”的内容随后应附加到“U”,以获得具有重复内容的文件。这部分应该通过给定的方法完成:

-exec bash -c 'cat temp >> "{}"' \;

但是,该命令没有给我想要的结果。我预计对于通过 find 找到的每个“U”,“temp”都会被覆盖。但是我看到之前找到的“U”的内容被附加到“temp”中,积累了它的内容。如果我尝试使用以下方法删除“temp”:

-exec rm -rf temp \;

然后我会收到一个错误:

cat: temp: 没有这样的文件或目录

为简单起见,我省略了其他一些 -exec 选项。

有人可以说我可能错在哪里吗?我很感激任何提示。

亲切的问候。

标签: bashduplicatesfindcat

解决方案


您不想在与 U 相同的目录-execdir-exec创建临时文件。并且重定向应该在 bash 会话中:实际上所有的 shell 操作都可以在同一个 shell 中运行:

find ... -execdir sh -c 'temp=$(mktemp) && cat "{}" > "$temp" && cat "$temp" >> "{}" && rm "$temp"'

如果您安装了该moreutils软件包,则sponge无需创建临时文件即可使用:

find ... -execdir sh -c '{ cat "{}"; cat "{}"; } | sponge "{}"'

推荐阅读