仅复制可执行文件(跨平台)

时间:2017-06-07 03:18:25

标签: linux bash macos build-script

我想将可执行文件从一个目录复制到另一个目录。

源目录包括我不关心的各种文件(构建工件)。我想只使用适用于OS X和Linux的bash脚本来获取可执行文件。

可执行文件是指具有可执行权限的文件,并且会传递test -x $filename

我知道我可以写一些python脚本,但后来我会介绍一个对python的依赖(只是为了复制文件!),这是我真正想要避免的。

注意:我似乎有几个类似的问题,但答案似乎只适用于Linux(因为有关Linux的问题)。请不要将此标记为重复,除非重复的问题确实只是关于跨平台复制可执行文件。

2 个答案:

答案 0 :(得分:3)

Your own answer在概念上很优雅,但很慢,因为它为每个输入文件(test)创建至少一个子进程,并为每个匹配的文件创建一个额外的进程(cp)。

这是更有效bash替代

  • 在shell代码中构建匹配输入文件的数组
  • 然后使用调用cp复制它们。
#!/usr/bin/env bash

exeFiles=()
for f in "$src_dir"/*; do [[ -x $f && -f $f ]] && exeFiles+=( "$f" ); done
cp "${exeFiles[@]}" "$dest_dir/"
  • exeFiles=()初始化用于存储匹配文件名的数组。
  • for f in "$src_dir"/*遍历直接位于$scr_dir的所有文件和目录;请注意*必须不加引号才能进行globbing(文件名扩展)。
    • [[ -x $f && -f $f ]]确定手头的项目是否可执行(-x)和(常规)文件-f;请注意,[[ ... ]]内的双引号变量引用(大部分)是可选的。
    • exeFiles+=( "$f" )向数组添加新元素
  • "${exeFiles[@]}"将结果数组作为一个整体引用,并作为单独的参数强健地扩展为数组元素 - 请参阅Bash arrays

答案 1 :(得分:2)

经过一些实验,这似乎适用于OS X和Ubuntu

find "$src_dir" -maxdepth 1 -type f -exec test -x {} \; -exec cp {} "$dest_dir/" \;

请注意,-maxdepth 1特定于我的用例,我不关心递归遍历所有目录。

-type f是必要的,因为目录也算作可执行文件

我传递了两个-exec标志。 exec标志不仅执行命令,还计为过滤器,因此如果命令返回非零退出代码,则过滤掉文件。

使用exec的方法是写出你想要的任何命令,使用{}提供当前文件,并以\;终止

仅当文件可执行时,第一个-exec才会返回成功退出代码。

第二个-exec执行复制,但如果第一个-exec失败则不执行。