我的要求是 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.class
for 作为字段分隔符(或者尝试在代码中将变量扩展用单引号引起来)对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
从其开头删除。