Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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仅将最高(文件夹层次结构)位置结果获取到变量中_Bash_Shell - Fatal编程技术网

bash仅将最高(文件夹层次结构)位置结果获取到变量中

bash仅将最高(文件夹层次结构)位置结果获取到变量中,bash,shell,Bash,Shell,我试图使用bash将最高(文件夹层次结构)的位置结果仅获取到一个变量中 administrator@JenkisSrv01:/tmp/test/frontend-2.0$ find -name pom.xml ./server/pom.xml ./server/mock/pom.xml ./assembly/pom.xml ./pom.xml 我只想将pom.xml的父文件夹的位置插入变量中 位置=./或绝对路径也可以使用“pwd”位置=/tmp/test/frontend-2.0 我想不出一

我试图使用bash将最高(文件夹层次结构)的位置结果仅获取到一个变量中

administrator@JenkisSrv01:/tmp/test/frontend-2.0$ find -name pom.xml
./server/pom.xml
./server/mock/pom.xml
./assembly/pom.xml
./pom.xml
我只想将pom.xml的父文件夹的位置插入变量中

位置=./或绝对路径也可以使用“pwd”位置=/tmp/test/frontend-2.0

我想不出一个好的命令来把这些信息放到一个变量中。。。
有人吗?

要仅获取目录名,可以使用如下命令

find $(pwd) -name pom.xml -exec dirname {} \;
如果只想获得最短路径,可以运行以下操作:

find $(pwd) -name pom.xml -exec dirname {} \; | awk '{ print length($0) " " $0; }' | sort -r -n|cut -d ' ' -f 2-|tail -1

要仅获取目录名,可以使用如下命令

find $(pwd) -name pom.xml -exec dirname {} \;
如果只想获得最短路径,可以运行以下操作:

find $(pwd) -name pom.xml -exec dirname {} \; | awk '{ print length($0) " " $0; }' | sort -r -n|cut -d ' ' -f 2-|tail -1
这将收集斜杠数最少的路径,并将其打印到命令替换中

location=$(find . -name pom.xml -exec dirname {} \; |
    awk -F / 'NR==1 || NF < min { min=NF; i=0 }
        NF<=min { a[++i] = $0 }
        END { for(j=1; j<=i; ++j) print a[j] }')
location=$(find.-name pom.xml-exec dirname{}\|
awk-F/'NR==1 | | NF
location=$(find . -name pom.xml -exec dirname {} \; |
    awk -F / 'NR==1 || NF < min { min=NF; i=0 }
        NF<=min { a[++i] = $0 }
        END { for(j=1; j<=i; ++j) print a[j] }')
location=$(find.-name pom.xml-exec dirname{}\|
awk-F/'NR==1 | | NFNF假设文件名中不包含转义字符(\0x1b),那么:

esc=$'\e'
while read -r -d "" f; do
    printf "%s%c" "${f//[^\/]/}$esc$f" $'\0'
done < <(find . -name pom.xml -print0) | sort -t "$esc" -z -k 1 | head -1 -z | cut -d "$esc" -z -f 2

首先,它从文件名中提取斜杠,用转义符作为分隔符将斜杠附加到原始文件名中,然后对文件名进行排序、标题和剪切。斜杠计数用于对最小斜杠的文件进行排序。

假设文件名中不包含转义符(\0x1b),那么:

esc=$'\e'
while read -r -d "" f; do
    printf "%s%c" "${f//[^\/]/}$esc$f" $'\0'
done < <(find . -name pom.xml -print0) | sort -t "$esc" -z -k 1 | head -1 -z | cut -d "$esc" -z -f 2

首先,它从文件名中提取斜杠,将斜杠附加到原始文件名,并使用转义符作为分隔符,然后对文件名进行排序、标题和剪切。斜杠的计数用于对最小斜杠的文件进行排序。

GNU find允许您-printf
%d
在目录树中列出文件的深度,以及
%h
到l列出其名称的前导目录,参见
info'(find)Format directions'

目标文件是pom.xml。我希望以下操作可以满足您的要求:按深度升序排序,并从第一行返回dirname。如果
$root
是绝对值,则可以跳过
realpath
步骤。需要不带制表符或换行符的文件名

v=$(查找“${root:-${PWD}”-键入f-name pom.xml-printf'%d\t%h\n'| sort-n | head-n1 | cut-f2)
v=$(realpath-e“$v”)

GNU find允许您-printf
%d
在目录树中列出文件的深度,
%h
列出文件名的前导目录,请参见
info'(find)Format directions'

目标文件是pom.xml。我希望以下操作可以满足您的要求:按深度升序排序,并从第一行返回dirname。如果
$root
是绝对值,则可以跳过
realpath
步骤。需要不带制表符或换行符的文件名

v=$(查找“${root:-${PWD}”-键入f-name pom.xml-printf'%d\t%h\n'| sort-n | head-n1 | cut-f2)
v=$(realpath-e“$v”)

如果在find上有多个结果,那么管道就没有意义了。我建议,在问题中给出示例,而不是使用
/path
使用
$(pwd)
谢谢你的回答,但我的意思是我只需要获得最高的(文件夹层次结构)位置,在本例中:/tmp/test/mGrid-frontend-2.0。虽然忽略了另一个,但我不认为
长度
是一种可靠的方式。例如,./assembly/pom.xml./server/mock/pom.xml./server/pom.xml./a/b/c/pom.xml将/home/user/a/b/c/作为最短的。当您有多个查找结果时,管道没有意义。我建议,给出问题中的示例,而不是使用
/path
使用
$(pwd)
谢谢你的回答,但我的意思是我只需要获得最高的(文件夹层次结构)位置,在本例中:/tmp/test/mGrid-frontend-2.0。虽然忽略了其他选项,但我不认为
长度
是一种可靠的方式。例如,./assembly/pom.xml./server/mock/pom.xml./server/pom.xml./a/b/c/pom.xml将/home/user/a/b/c/作为最短的。显然,可以有多个文件具有最小的子文件如果当前目录中没有匹配的文件,则会出现多个子目录数最少的文件。如果当前目录中没有匹配的文件,则显然会出现多个子目录数最少的文件。使用-print0和
esc
可以很好地识别文件名中的特殊字符,但这会中断
排序
head
cut
,它们不会处理名称中有换行符的文件。感谢您的评论。我已更新了我的答案,以支持包含换行符的文件名。请注意,
sort
head
cut
的旧版本可能不支持
-z
选项。这仍然会导致错误k如果文件名包含反斜杠代码,该代码由
echo-e
解释。最好使用-print0和
esc
来注意文件名中的特殊字符,但在
排序
剪切上会出现中断,这将不会处理名称中有换行符的文件。感谢您的帮助您的评论。我已经更新了我的答案,以支持包含换行符的文件名。请注意,
排序
剪切
的旧版本可能不支持
-z
选项。如果文件名包含由
echo-e
解释的反斜杠代码,则此选项仍将中断。