2017-06-07 73 views
1

我想将可执行文件从一个目录复制到另一个目录。仅复制可执行文件(跨平台)

源目录包括我不关心的各种文件(构建工件)。我想只抓取可执行文件,使用可在OS X和Linux上运行的bash脚本。

通过可执行文件,我的意思是一个文件具有可执行权限,并且会通过test -x $filename

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

注:我似乎有几个类似的问题,但答案似乎只适用于Linux(如专门问到Linux的问题)。请不要将其标记为重复,除非重复问题确实只涉及跨平台复制可执行文件。

+0

另请参见https://stackoverflow.com/a/4458361/2908724 – bishop

回答

2

Your own answer是概念上优雅,但速度慢,因为它为每一个输入文件(test)至少创建了一个子进程,外加一个用于每个匹配文件(cp)。

这里的一个更高效bash替代在于:

  • 积聚在壳代码匹配输入文件的阵列,他们使用调用的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的所有文件和目录;请注意0​​必须为未加引号以进行通配符(文件名扩展)。
    • [[ -x $f && -f $f ]]确定手边的物品是否可执行(-x)和(常规)文件-f;请注意,在[[ ... ]]内双引号变量引用(大部分)是可选的。
    • exeFiles+=("$f")追加一个新的元素到所述阵列
  • "${exeFiles[@]}"是指所得到的阵列作为一个整体,鲁棒扩展到数组元素作为单独的参数 - 见Bash arrays
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失败,则不会执行该复制。