awk 无法满足我的要求

awk 无法满足我的要求

我的要求是 shell 脚本应该打印文件的文件夹名称。

例如 comp.class 存在于 D:/Practice/HelloWorldPractice/bin 文件夹中,执行命令后我应该得到输出垃圾桶

我的命令搜索文件并打印该文件的完整路径。之后,它从完整路径中删除文件名。最后,它删除除文件的文件夹名称之外的所有内容。

代码

filesDirName="/D/Practice/HelloWorldSagar"
file=comp.class
echo $(find "${filesDirName}" -name ${file}) | awk -F '${file}' '{ print $1 }'| awk -F '${filesDirName}' '{ print $2 }'

输出 空输出

代码

当我在终端中输入以下命令时,它工作正常......但是当我通过变量执行此操作时,我无法获得输出。

echo "$(find "/D/Practice/HelloWorldSagar" -name comp.class)" | awk -F 'comp.class' '{ print $1 }'| awk -F '/D/Practice/HelloWorldSagar' '{ print $2 }'

输出

/垃圾桶/

答案1

使用comp.classfor 作为字段分隔符(或者尝试在代码中将变量扩展用单引号引起来)对awk我来说没有什么意义,就像awk在管道中相互运行多个程序一样。

据我了解,您需要包含该comp.class文件的目录的文件名。

这是这样做的:

topdir='/D/Practice/HelloWorldSagar'
filename='comp.class'

find "$topdir" -type f -name "$filename" \
    -exec sh -c 'basename "$(dirname "$1")"' sh {} ';'

这将查找comp.class在 或以下调用的所有文件/D/Practice/HelloWorldSagar。当找到一个路径名时,一个简短的 shell 脚本会简单地打印出所找到路径名的目录路径的基本名称(路径名的文件名部分)。

或者,查找目录,然后单独测试文件是否存在:

find "$topdir" -type d \
    -exec test -f {}/"$filename" ';' \
    -exec basename {} ';'

comp.class这会测试在所有找到的目录$topdir(包括其本身)中是否存在$topdir。找到文件后,会打印找到的目录的基本名称。

两种方法之间的区别在于,第二种方法还会检测到符号链接称为comp.class指向常规文件。

有关的:


以防万一它不是您想要的目录的基本名称,而是下面的相对路径$topdir

find "$topdir" -type f -name "$filename" \
    -exec sh -c 'd="$(dirname "$2")"; printf "%s\n" "${d#$1/}"' sh "$topdir" {} ';'

这是第一个解决方案的变体,它将目录名称提取到变量中d,然后打印该目录路径名的值,并$topdir从其开头删除。

相关内容