Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在GNU中使用命令替换和执行shell;查找“;exec命令_Bash_Find - Fatal编程技术网

Bash 在GNU中使用命令替换和执行shell;查找“;exec命令

Bash 在GNU中使用命令替换和执行shell;查找“;exec命令,bash,find,Bash,Find,我是一个bash新手,我正在尝试做一些看起来相当简单但有问题的事情 我正在尝试搜索一个具有非常通用但非唯一名称(例如analysis.uniquext,但也可能是sorted_result.uniquext)的文件,该文件可以位于从不同的“find”查询中找到的目录的一个特定子目录中。然后,我想将该文件复制到我的个人目录,同时将该文件重命名为更具描述性的文件,以提示其原始位置 以下是我尝试过的一个例子: case=/home/data/ABC_123 # In reality this is c

我是一个bash新手,我正在尝试做一些看起来相当简单但有问题的事情

我正在尝试搜索一个具有非常通用但非唯一名称(例如analysis.uniquext,但也可能是sorted_result.uniquext)的文件,该文件可以位于从不同的“find”查询中找到的目录的一个特定子目录中。然后,我想将该文件复制到我的个人目录,同时将该文件重命名为更具描述性的文件,以提示其原始位置

以下是我尝试过的一个例子:

case=/home/data/ABC_123 # In reality this is coming from a different query successfully
specific_id=ABC_123 # This was extracted from the previous variable
OUTDIR=/my/personal/directory

mkdir -p $OUT_DIR/$this_folder

find $case/subfolder/ -type f -name "*.uniqueExt" -exec sh -c 'cp "$1" ${OUT_DIR}/${specific_id}/$(basename "$1")' sh {} \;
这不起作用,因为OUT_DIR和specific_id在由-exec命令创建的内部shell中没有作用域

所以我试着用另一种方法:

find $case/subfolder/ -type f -name "*.uniqueExt" -exec cp {} ${OUT_DIR}/${specific_id}/$(basename {}) \;
但是现在我无法提取在“find”查询中找到的文件的basename,因为我没有调用shell来提取

有没有一种方法可以在示例#1中正确定义变量的范围,或者在示例#2中执行basename函数来实现这一点?或者可能有一个完全不同的解决方案(可能涉及多个-exec调用?或者可能只是将查找结果传送到xargs?)


谢谢你的帮助

您需要导出变量,因为您在不同的shell进程中使用它们,而不是在其中分配它们

导出变量使它们在子进程中可用

export specific_id=ABC_123 # This was extracted from the previous variable
export OUTDIR=/my/personal/directory
但是,您实际上不需要为此使用shell。你可以用

find $case/subfolder/ -type f -name "*.uniqueExt" -exec cp -t "$OUTDIR/$specific_id/" {} +
您不必自己调用
basename
,因为将文件复制到目标目录会自动使用basename作为目标文件名


在我的版本中,我使用
-t
选项,这样我可以将目标目录放在第一位。这允许它使用
+
变量将所有找到的文件名放在一个命令中,而不是为每个文件分别运行
cp

您需要导出变量,因为您在不同的shell进程中使用它们,而不是在分配它们的shell进程中使用它们

导出变量使它们在子进程中可用

export specific_id=ABC_123 # This was extracted from the previous variable
export OUTDIR=/my/personal/directory
但是,您实际上不需要为此使用shell。你可以用

find $case/subfolder/ -type f -name "*.uniqueExt" -exec cp -t "$OUTDIR/$specific_id/" {} +
您不必自己调用
basename
,因为将文件复制到目标目录会自动使用basename作为目标文件名


在我的版本中,我使用
-t
选项,这样我可以将目标目录放在第一位。这允许它使用
+
变量将所有找到的文件名放在一个命令中,而不是对每个文件分别运行
cp

更准确地说:
export
ing将它们(以及它们的副本)提供给导出它们的进程的子进程。由于
find
是运行脚本的shell的子进程,而
find
作为自身的子进程运行
sh-c…
,因此该子进程shell将继承这些值。(我之所以添加这一点,是因为很多人希望导出的变量传递给父进程,但这并没有发生。)我添加了一些说明。更准确地说:
export
ing这些变量使导出它们的进程的子进程可以使用它们(嗯,它们的副本)。由于
find
是运行脚本的shell的子进程,而
find
作为自身的子进程运行
sh-c…
,因此该子进程shell将继承这些值。(我之所以添加这一点,是因为很多人希望导出的变量传递给父进程,但事实并非如此。)我添加了一些说明。