Bash-迭代文件,排除目录
我正在尝试将目录中的文件重命名为小写。我需要循环他们的名字。我试过:Bash-迭代文件,排除目录,bash,Bash,我正在尝试将目录中的文件重命名为小写。我需要循环他们的名字。我试过: for i in *; 但这会迭代文件和目录。如何创建它,使其只在文件中迭代?测试它是否是文件,然后执行您的命令。如果不是文件,则&&将短路,第二部分将不执行 for i in *; do [[ -f "$i" ]] && echo "$i"; done 在Doon给出答案多年后,我发现了一个(可以说)更好的解决方案,基于。它不需要在回路主体内部进行任何测试: for fn in $(ls -p | gre
for i in *;
但这会迭代文件和目录。如何创建它,使其只在文件中迭代?测试它是否是文件,然后执行您的命令。如果不是文件,则
&&
将短路,第二部分将不执行
for i in *; do [[ -f "$i" ]] && echo "$i"; done
在Doon给出答案多年后,我发现了一个(可以说)更好的解决方案,基于。它不需要在回路主体内部进行任何测试:
for fn in $(ls -p | grep -v /); do echo $fn; done
将列出当前目录的内容,并在目录名后附加ls-p
/
将过滤输出,删除带有grep-v/
/
$i
中删除$
——在(隐含)赋值中,Bash变量不得以$
作为前缀。使用globbing.Done时,无需修改$IFS
。使用IFS是因为某些文件名包含空格。即使文件名带有嵌入空格(或其他shell元字符),Globbing也会做正确的事情,因此仍然不需要IFS
(在其他上下文中肯定有)。除此之外,您正在将$IFS
设置为以下字符:“\”和“n”-要实际将其设置为换行符,必须使用ANSI C引号字符串:IFS=$'\n'
您是对的。我不知道。谢谢您还可以将*替换为$(ls*)或$(ls foo-*)来执行一些更自定义的迭代。我不喜欢在不需要的地方使用外部命令。另外,如果我错了,请纠正我,但ls是为人类可读输出而设计的,对吗?我建议使用test
而不是“[[]”