我想将可执行文件从一个目录复制到另一个目录。
源目录包括我不关心的各种文件(构建工件)。我想只使用适用于OS X和Linux的bash脚本来获取可执行文件。
可执行文件是指具有可执行权限的文件,并且会传递test -x $filename
。
我知道我可以写一些python脚本,但后来我会介绍一个对python的依赖(只是为了复制文件!),这是我真正想要避免的。
注意:我似乎有几个类似的问题,但答案似乎只适用于Linux(因为有关Linux的问题)。请不要将此标记为重复,除非重复的问题确实只是关于跨平台复制可执行文件。
答案 0 :(得分:3)
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
的所有文件和目录;请注意*
必须不加引号才能进行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
失败则不执行。