Bash 如何使用find命令查找和替换jar文件

Bash 如何使用find命令查找和替换jar文件,bash,unix,Bash,Unix,我在一个基本目录下有多个子目录。如果子目录有x.jar,我需要在另一个路径中复制几个可用的jar文件 我使用下面的命令来查找x.jar,然后我尝试复制jar文件 find . -type f -name x.jar | xargs cp /home/sampath.anisetti/tmp/*.jar 我得到的cp:target./test3/x.jar不是目录 请建议 注意:如果子目录没有x.jar,则在复制时需要跳过该目录。如何: find . -type f -name x.jar -p

我在一个基本目录下有多个子目录。如果子目录有x.jar,我需要在另一个路径中复制几个可用的jar文件

我使用下面的命令来查找x.jar,然后我尝试复制jar文件

find . -type f -name x.jar | xargs cp /home/sampath.anisetti/tmp/*.jar
我得到的
cp:target./test3/x.jar
不是目录

请建议

注意:如果子目录没有x.jar,则在复制时需要跳过该目录。

如何:

find . -type f -name x.jar -print0 |
    while IFS= read -r -d'' file; do
        cp -- /home/sampath.anisetti/tmp/*.jar "$(dirname -- "$file")"
    done
它将找到所有名为
x.jar
的文件,然后对于每个这样的文件,它将找到该文件所在的目录,并将所有其他
*.jar
文件复制到该目录中。

这样如何:

find . -type f -name x.jar -print0 |
    while IFS= read -r -d'' file; do
        cp -- /home/sampath.anisetti/tmp/*.jar "$(dirname -- "$file")"
    done

它将找到所有名为
x.jar
的文件,然后对于每个这样的文件,它将找到该文件所在的目录,然后将所有其他
*.jar
文件复制到那里。

你能解释一下
--
标志在
cp
中的签名用法吗?@Inian这只是我所有脚本中都包含的一些标准预防措施。它确保
cp
(或
dirname
)如果文件名以
-
开头,则不会将其视为命令行标志。可以避免使用sub-shell,使用
进程替换
,如
done@123:记得以前读过这里,也许我错了。因此,进程替换在子shell上运行所有操作,并且根本不使用本地环境?@ini命令在子shell中运行,而不是在proc sub中的循环中运行,而不是在管道中以相反的方式运行。它允许你保留变量。你能解释一下
cp
--
标志的签名用法吗?@Inian这只是我所有脚本中的一些标准预防措施。它确保
cp
(或
dirname
)如果文件名以
-
开头,则不会将其视为命令行标志。可以避免使用sub-shell,使用
进程替换
,如
done@123:记得以前读过这里,也许我错了。因此,进程替换在子shell上运行所有操作,并且根本不使用本地环境?@ini命令在子shell中运行,而不是在proc sub中的循环中运行,而不是在管道中以相反的方式运行。它允许你保存变量。你有gnu查找吗?你有gnu查找吗?