Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-迭代文件,排除目录_Bash - Fatal编程技术网

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/
    将过滤输出,删除带有
    /

A语法旁白:从
$i
中删除
$
——在(隐含)赋值中,Bash变量不得以
$
作为前缀。使用globbing.Done时,无需修改
$IFS
。使用IFS是因为某些文件名包含空格。即使文件名带有嵌入空格(或其他shell元字符),Globbing也会做正确的事情,因此仍然不需要
IFS
(在其他上下文中肯定有)。除此之外,您正在将
$IFS
设置为以下字符:“\”和“n”-要实际将其设置为换行符,必须使用ANSI C引号字符串:
IFS=$'\n'
您是对的。我不知道。谢谢您还可以将*替换为$(ls*)或$(ls foo-*)来执行一些更自定义的迭代。我不喜欢在不需要的地方使用外部命令。另外,如果我错了,请纠正我,但ls是为人类可读输出而设计的,对吗?我建议使用
test
而不是“[[]”