Bash新手求助:列出文件夹时如何排除指定目录(如MASTER)
嘿,作为Bash新手碰到这种小挫折太正常啦!我来帮你搞定排除指定文件夹的需求~
方法1:用
find命令(最推荐) find是处理文件/文件夹查找的利器,语法清晰还不容易踩坑。要列出当前目录下所有直接子文件夹,排除名为MASTER的,直接用这条命令:
find . -type d ! -name "MASTER" -maxdepth 1
给你拆解下每个参数的作用:
.:从当前目录开始查找-type d:只筛选文件夹(directory)! -name "MASTER":排除名字正好是MASTER的文件夹(注意!前后一定要加空格,不然会报错)-maxdepth 1:只查当前目录的直接子文件夹,不深入嵌套的子目录(如果需要查找所有层级的文件夹,去掉这个参数就行)
要是你需要排除多个文件夹,比如MASTER和TEMP,只需要再加一个排除条件:
find . -type d ! -name "MASTER" ! -name "TEMP" -maxdepth 1
方法2:用
for循环(适合理解基础逻辑) 如果你之前是用for循环写的脚本,大概率是过滤逻辑没写对。试试这个正确的写法:
for dir in */; do dir_name=${dir%/} # 去掉文件夹名末尾的斜杠,得到纯名字 if [ "$dir_name" != "MASTER" ]; then echo "$dir_name" fi done
这里要注意两个关键点:
*/会匹配当前目录下所有文件夹(默认末尾带斜杠),用${dir%/}可以去掉这个斜杠,得到干净的文件夹名称- 比较字符串时,变量一定要加双引号,不然如果文件夹名里有空格、特殊字符,脚本会直接报错
你可能踩过的坑
很多新手会尝试用ls -d */ | grep -v MASTER这种写法,但非常不推荐!因为如果文件夹名里包含空格、换行或者特殊字符,ls的输出会乱掉,后续处理很容易触发错误。所以尽量用上面两种更可靠的方式哦。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

