将二进制文件从 /sourcedir 及其子目录复制到 /destdir

将二进制文件从 /sourcedir 及其子目录复制到 /destdir

我想将所有二进制文件从 /sourcedir 及其子目录复制到 /destdir。基本上,所有文件都带有:无扩展名,所有文件都带有 *.a、*.so、*.ko,并从复制中排除:Makefile 和 *.depend。从名为“excludeDir”的子目录中排除文件复制。该命令应将所有二进制文件放在一个文件夹中。

我已经从 bash 尝试了以下操作:

find /my/sourcedir/ -mindepth 2 -type f -not -iname "excludeDir" -or "*.c" -or "*.h" -or "makefile" -print -exec cp {} /my/destdir \;

bash 脚本产生以下错误:

查找:路径必须在表达式之前:'*.c'

给我带来麻烦的部分是排除(文件:* .h,* .c,Makefile 和子目录:“excludeDir”)

使用 mjb2kmn 的建议,以下命令除了通配符之外效果很好。

find /opt/ppmac-exp/ -mindepth 2 -not -iname *.c -not -iname *.cpp -not -iname *.cc -not -iname *.cs -not -iname *.h -not -iname *.cfg -not -iname *.sh -not -iname *.layout -not -iname *.depend -not -iname Makefile -not -iname Makefile* -type f -print -exec cp {} /opt/build \;

答案1

... 在 stackoverflow 上的 mjb2kmn 和 dash-o 的帮助下,这个方法奏效了,并防止了通配符。谢谢大家!

find /my/sourcedir/ -mindepth 2 -type f \
 \( -not -iname "excludeDir" \
    -not -iname '*.c' \
    -not -iname '*.h' \
    -not -iname '.ssh' \
    -not -iname "Makefile" \) \
 -exec cp {} /my/destdir \;

答案2

我意识到原始海报询问如何在查找中执行此操作。

您正在做的事情相当复杂,很难在 find 中轻松表达。

如果您的系统上有 perl,那么使用 find2perl 可能会更好。它会获取您的语法,并为您编写一个您可以直接运行的小 perl 脚本;或者编辑以添加更多检查等。请参阅https://perldoc.perl.org/5.8.8/find2perl.html

或者,只需在 Makefile 中定义要复制的内容的名称,然后创建直接执行复制的目标作为 Makefile 的一部分...

答案3

如果您还想保留复制元素的目录结构,则可以使用此版本。两个先决条件使其变得更容易:

  1. 您从源目录运行它(以安排find输出中的相对路径) - 可以解决这个限制,但需要对查找输出进行更多的处理。
  2. 您使用辅助脚本来处理来自的每个文件路径find,因为在其中运行子shell命令find -exec不起作用。

设置

cat > /tmp/helper.sh <<__EOF__
#!/bin/sh
mkdir -p "/my/destdir/$(dirname "$1")"
cp -v "$1" "/my/destdir/$(dirname "$1")/"
__EOF__
chmod +x /tmp/helper.sh

执行

cd /my/sourcedir
find -mindepth 2 -type f \
  [conditions] \
-exec /tmp/helper.sh "{}" \;

相关内容