2012-11-22 35 views
3

我正在尝试编写一些脚本,它比我要向您展示的内容更复杂一些,但我知道问题出在这一部分。将文件名分配给shell中的变量

我希望通过for循环将目录中文件列表的每个名称分配给一个变量(同一变量,一次一个),然后在循环中执行一些操作,看看有什么意思:

for thing in $(ls $1); 
do 
    file $thing; 
done 

编辑:让我们说这个scrypt被称为scrypt,我有一个命名的文件夹的文件夹,它具有内部命名为A,B,C 3个文件。我想让它显示我在终端上,当我写这篇文章:

./scrypt Folder 

如下:

A: file 
B: file 
C: file 

用我上面显示的代码,我得到这个:

A: ERROR: cannot open `A' (No such file or directory) 
B: ERROR: cannot open `B' (No such file or directory) 
C: ERROR: cannot open `C' (No such file or directory) 

即问题

+1

怎么了,你有什么 –

+0

是的,这里唯一的错误是打破空白 – Kevin

+0

以及它说这样做为每个文件:错误:无法打开文件(没有这样的文件或目录) – Zasito

回答

3

一种方法是使用通配符扩展而不是ls,例如,

for filename in "$1"/*; do 
    command "$filename" 
done 

这里假设$1是包含文件的目录的路径。

如果你想只对普通文件进行操作,沿着线do之后增加一个检查:

[ ! -f "$filename" ] && continue 
+0

最好的方法,假设每个'$ 1'都是一个文件夹, – Kevin

+0

会将目录名称分配给文件名,我需要给n目录中文件的一部分到文件名。 – Zasito

+0

@ Zasito:不,这将依次指定该目录中文件的整个路径。如果你只需要文件名,你可以使用'basename“$ filename”'来提取没有路径的文件名。 – Arkku

0

这是有点联合国清楚你正在努力完成的任务,但你基本上可以用find已经存在的功能做同样的事情。例如,下面的打印的每个文件的文件夹中找到的内容:

find FolderName -type f -maxdepth 1 -exec cat {} \; 
0

好, 我认为你的意思是,环路将显示所需的目录文件名。 所以,我会做这样的:

for filename in "$1"/*; do 
echo "file: $filename" 
done 

这样的结果应该是(如果在DIR 3个文件和名称ABC:

`file: A 
`file: B 
`file: C