在Shell脚本中循环时如何获取目录和文件名
问题的出现原因:在Shell脚本中循环时,如何获取目录和文件名。
解决方法:
在Bash中,可以使用以下代码来解决这个问题:
shopt -s nullglob for f in /path/to/*/*.ext; do my_command "${f%/*}" "${f##*/}" done
使用shopt -s nullglob
命令是强烈推荐的,这样当没有匹配项时,通配符/path/to/*/*.ext
会扩展为空,从而循环不会执行,不会使用随机的原文参数/path/to/*
和*.ext
来执行my_command
命令。
在Shell脚本中循环时如何获取目录和文件名
在Shell脚本中,我们经常需要在循环中处理多个文件。有时候,我们需要获取每个文件的目录和文件名,以便进行进一步的操作。本文将介绍在Shell脚本中获取目录和文件名的问题及解决方法。
问题描述:
在Shell脚本中,我们希望在循环中获取每个文件的目录和文件名。
解决方法:
有几种方法可以在Shell脚本中获取目录和文件名。下面将介绍两种常用的方法。
方法一:使用basename和dirname命令
for f in /path/to/*/*.ext do command "$(dirname "$f")" "$(basename "$f")" done
上述代码中,`$f`代表文件路径,`$(dirname "$f")`获取文件的目录名,`$(basename "$f")`获取文件的文件名。你可以在`command`中替换为你需要的操作。
方法二:使用awk命令删除文件扩展名
for f in /path/to/*/*.ext ;do echo "$f"|awk -F\/ '{a=$NF;$NF="";gsub(".ext","",a)}{print $0" "a}' OFS=\/ done
上述代码中,`$f`代表文件路径,`awk -F\/`用于设置分隔符为`/`,`a=$NF`获取文件名,`$NF=""`将最后一个字段(即文件名)置为空,`gsub(".ext","",a)`删除文件名中的`.ext`扩展名,`{print $0" "a}`打印目录名和文件名。
结论:
通过使用basename和dirname命令或awk命令,我们可以在Shell脚本中循环时获取目录和文件名。这些方法可以帮助我们更方便地处理多个文件,并进行进一步的操作。