将文件名分配给shell中的变量

时间:2012-11-22 20:14:48

标签: bash shell variables for-loop ls

我正在尝试编写一个脚本来做一些比我要向你展示的更复杂的脚本,但我知道这个问题就在这个部分。

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

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

编辑:让我们说这个scrypt叫做Scrypt,我有一个名为Folder的文件夹,里面有3个名为A,B,C的文件。当我写这篇文章时,我想让它在终端上给我看:

./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)

这就是问题

4 个答案:

答案 0 :(得分:3)

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

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

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

如果您只想对普通文件进行操作,请在do之后添加一个检查:

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

答案 1 :(得分:3)

http://mywiki.wooledge.org/ParsingLs

改为使用globbing:

for filename in "$1"/* ; do
    <cmd> "$filename"
done

请注意$ filename

周围的引号

答案 2 :(得分:0)

您要完成的内容有点不清楚,但基本上可以使用find已存在的功能执行相同的操作。例如,以下内容打印文件夹中找到的每个文件的内容:

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

答案 3 :(得分:0)

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

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

结果应该是这样的(如果在dir中是3个文件,名称是A B C:

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