2016-04-22 77 views
0

我想循环通过目录内的文件名,以便我可以执行每个操作。bash做循环与目录的长度

我能遍历仅有10名,如果我使用:

var=($(ls directory)) 
for k in {1..10} 
do 
    echo ${var[$k]} 
done 

这使我在我的目录中的第10名。但是,我想循环所有这些。

如果我做的:

length=($(ls directory -1 | wc -l)) 

我得到的长度(在这个例子中,它是62)

所以,当我结合得不得了:

var=($(ls directory)) 
length=($(ls directory -1 | wc -l)) 
for k in {1..$length} 
do 
    echo ${var[$k]} 
done 

我得到的错误'语法错误:期望的操作数(错误标记为“{1..62}”)

任何帮助解决此问题或更好的s解决方案将不胜感激!

+0

[括号扩展] (https://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion)既强大又有限。观察它发生在任何变量被展开之前,所以任何尝试使用'{1 .. $ length}'注定要失败。 –

回答

1

Brace扩展是在变量扩展之前由shell执行的,因此你会得到错误。

您可以使用:

for k in $(seq 1 "$length") 

来解决这个问题。

files=(*) 
for i in "${files[@]}"; do echo "$i"; done 

或更简单:


另外你在做什么,可以很容易地完成

printf '%s\n' "${files[@]}" 
+0

完美!感谢您的帮助! –

+0

@ M.Simpson没问题..请阅读http://stackoverflow.com/help/someone-answers – heemayl

1

为什么不干脆:

for file in *; do 
    if [ -f "$file" ]; then 
    echo "Do what you want with" "$file"; 
    fi 
done 
+0

一个问题是,您的答案和其他答案(如我输入的)处理的是'ls directory'部分。最重要的是,使用'directory/*'可以工作;它会以可用格式给出名称(并且'shopt -s nullglob'可能是有益的)。然而,'ls'命令只给出'file',其中'directory/*'会产生'directory/file'。这可以在循环中处理(例如,'basename',或者小注意'$ {file ## *//'')。 –

+0

添加了一个测试来获取文件。 – SLePort

+0

@JonathanLeffler:或者:(cd目录;对于文件*; do ...; done)' – rici