我是新人,我有一个小问题,我自己无法解决。这是我面临的问题:
我正在尝试查找名称中带有空格的文件。
这部分正在工作:
find $(pwd) -type d |grep " "
然后我使用
awk
打印整个文件名并使用所需的组名称“手动输入”更改它find $(pwd) |grep " " |awk '{print "changegrp developers \""$0"\""}'
当我尝试将组名称设置
developers
为变量时,它并没有真正按预期工作。find $(pwd) |grep " " |awk group="developers" '{print "changegrp group \""$0"\""}'
我真的不明白语法。手动输入的组怎么可能起作用,当我将其设为变量时,它也能起作用。我知道这类事情可能会因为忘记一个单引号或双引号等而带来一些麻烦。
你能指出我哪里做错了吗?
答案1
要将group
您需要的变量传递给 awk-v group="developers"
并让 awk 将其视为变量(而不是字符串文字),它需要位于双引号之外,例如
awk -v group="developers" '{print "changegrp " group " \""$0"\""}'
然而,你可以通过使用类似的东西来避免很多令人头痛的事情
find . -type d -name '* *' -exec changegrp developers {} \;
或者(如果changegroup
支持多个文件参数 - 我不熟悉特定命令)
find . -type d -name '* *' -exec changegrp developers {} +
也可以看看
答案2
避开find
和awk
,并假设您只对目录感兴趣(根据您的第一个代码片段):
shopt -s globstar dotglob nullglob
for name in ./**/*' '*; do
[[ -d $name ]] && [[ ! -L $name ]] && changegrp developers "$name"
done
或者,
shopt -s globstar dotglob nullglob
for name in ./**/*' '*/; do
[[ ! -L ${name%/} ]] && changegrp developers "$name"
done
changegrp
这使用一个简单的循环在名称中至少有一个空格的每个目录上执行命令。它通过匹配子目录的**
通配模式(通过globstar
中的 shell 选项启用)来实现这一点。和shellbash
选项用于使 shell 删除不匹配的模式并匹配隐藏名称。nullglob
dotglob
此处使用测试-L
来清除目录的符号链接(-d
测试将是真的对于目录和目录的符号链接)。
在上面代码的第二个变体中,我们通过/
在模式末尾添加 a 来仅选择目录。测试时需要去掉这条斜杠-L
,这就是${name%/}
正在做的事情。
然后很容易让字符串developers
成为一个变量:
shopt -s globstar dotglob nullglob
group=developers
for name in ./**/*' '*; do
changegrp "$group" "$name"
done
(此代码还适用changegrp
于全部根据问题中的其他代码片段,当前目录中或当前目录下包含空格的名称。)