使用名称中包含空格的隐藏文件和文件\文件夹

问题描述 投票:0回答:1

我创建了一个脚本,它获取当前目录中的所有文件,检查它是常规文件还是文件夹,并为它们设置权限。

我的问题是当我遇到名称中包含空格的隐藏文件\文件夹和文件\文件夹时。

这是我的脚本:

#!/bin/bash
FILES=$(pwd)/*
for f in $FILES
  do
  if [ -f $f ]; then chmod u+x $f; fi
  if [ -d $f ]; then chmod u=w,g+r,o-rwx $f; fi
done

以下是我从测试计算机获得的错误示例:

'test / .bwhajtbzmu xswxcgqsvz'拥有不正确的权限:预期250,得到414。

其他错误基本相同。

我真的不确定这里有什么问题,如果它是一个隐藏文件或它在名称中有空格的事实。我想这两件事都是问题所在。

如何修改脚本以便它可以使用隐藏文件和名称中有空格的文件?

谢谢

PS。请不要质疑剧本的用处,这是学校的功课。

linux bash shell
1个回答
3
投票

处理文件名中的空格很棘手。第一条规则是:围绕变量的所有用法进行双引号。否则,shell将空格解释为分隔符。不幸的是,你不能简单地在变量中保存一个列表。你必须为此使用数组变量。

#!/bin/bash

FILES=( "$(pwd)"/* )

for f in "${FILES[@]}"
do
  if [ -f "$f" ]; then chmod u+x "$f"; fi
  if [ -d "$f" ]; then chmod u=w,g+r,o-rwx "$f"; fi
done

为了处理隐藏文件和文件夹(以点.开头的那些),你应该最好设置shell选项dotglob,这使得*也匹配这些(否则它没有)。 (使用.*并不好,因为它也匹配通常不需要的...,像.??*这样的东西不会像.a这样通常需要的东西。):

shopt -s dotglob
FILES=( "$(pwd)"/* )
shopt -u dotglob

我不建议将它打开,所以我在使用后将其关闭。

© www.soinside.com 2019 - 2024. All rights reserved.