bash - 使用 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 选项。
有人可以说我可能错在哪里吗?我很感激任何提示。
亲切的问候。
解决方案
您不想在与 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 "{}"'
推荐阅读
- javascript - AJAX响应文本到全局变量
- java - java - 如果登录身份验证在java spring security中失败,如何获取anonymousUser用户名?
- ios - 如何将一种 UIImage(UIAnimatedImage) 类型转换为 NSData 以使用 Alamofire 上传
- microsoft-graph-api - 通过 extensionName 创建 Open 扩展创建具有 id 的扩展
- php - 使用 PHP 使用 HTML 表单在新页面中编辑填充了 MySQL db 的 HTML 表行
- python - 仅为特定文件设置 Windows 文件类型关联
- python - 按组平均比较表
- php - Laravel 5.4/Blade 没有显示一个带有空格的空字符串变量:“”
- security - 允许网络应用使用您的加密交易 API 密钥,但不信任它们
- python - 无法在 Windows 上安装文本