3

我正在尝试编写一个比我将要向您展示的内容更复杂的脚本,但我知道问题出在这部分。

我希望通过循环将目录中文件列表的每个名称分配给一个变量(同一个变量,一次一个)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

4 回答 4

3

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

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

这假定它$1是其中包含文件的目录的路径。

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

[ ! -f "$filename" ] && continue
于 2012-11-22T20:18:20.450 回答
3

http://mywiki.wooledge.org/ParsingLs

改用通配符:

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

注意 $filename 周围的引号

于 2012-11-22T20:21:01.407 回答
0

有点不清楚您要完成什么,但您基本上可以使用find. 例如,以下打印文件夹中找到的每个文件的内容:

find FolderName -type f -maxdepth 1 -exec cat {} \;
于 2012-11-22T20:50:01.693 回答
0

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

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

这样结果应该是(如果目录中有3个文件并且名称是ABC:

`file: A
`file: B
`file: C
于 2014-01-11T21:07:22.937 回答