在bash中,我如何打印列表的前n个元素?

18

bash 中,我该如何打印出列表的前 n 个元素?

比如说,这个列表中的前10个文件:

FILES=$(ls)

更新:我忘了说我想要把元素打印在一行上,就像你用echo $FILES打印整个列表时一样。


我对我的解决方案进行了小小的更正。它应该在一行上打印所有文件名。你试过了吗? - Ayman Hourieh
1
请阅读:http://mywiki.wooledge.org/ParsingLs -- 如果您想避免在文件上发生灾难,了解Bash的复杂性和陷阱非常重要。 - lhunath
8个回答

31
FILES=(*)
echo "${FILES[@]:0:10}"

如果文件名中有空格也应该正常工作。

FILES=$(ls) 创建一个字符串变量。FILES=(*) 创建一个数组。在这个页面上查看更多有关在bash中使用数组的示例。(感谢lhunath)


不,它会打印出数组的前10个元素。该数组包含文件名作为项。 - Ayman Hourieh
你对 ABS 的引用有误。它们不使用引号(典型的 ABS),因此会导致在扩展文件名时出现单词拆分错误。ABS 充满了这样的隐藏错误,使得任何从中学习的人(除了你,显然你做得对)都会继承这些错误!我建议参考 http://mywiki.wooledge.org/BashGuide/TheBasics/Arrays。 - lhunath
在我看来,ABS包含大量有用的信息。但在这种情况下,您提供的链接更为相关,因此我将其添加到了我的答案中。 - Ayman Hourieh
你应该更清楚地了解 FILE=(*); 可以考虑使用原始命令替代:FILES=($(ls))。 - guns
1
@guns,为什么要生成ls进程,当你可以使用 globbing(通配符扩展)呢? - Ayman Hourieh
@guns:当文件名包含空格时,这也不能正确处理。 - ephemient

10
为什么不用以下代码打印前50个文件:
ls -1 | head -50

OP希望将其打印在一行上。请参见评论。 - kubanczyk
@kubanczyk 变成:ls -1 | head -50 | tr '\n' ' ' - user3817445

6
FILE="$(ls | head -1)"

当我尝试时,也能正确处理文件名中的空格。


这可以给你多个目录。也许你的意思是 $(ls -1 | head -1) - nh2

4

我的做法是:

ls | head -10 | tr "\n" " "

这将打印由ls返回的前10行,然后tr将所有换行符替换为空格。输出将在一行上。

不错的回答。也许你应该添加-1,例如ls -1 | head -10 | tr "\n" " "。无论如何,这就是我要找的 ;) - silgon
这是我认为最好的答案。简单明了。列出它们。选择前10个。将换行符去除以获得空格。完成了。很好的答案。 - user2233949

3
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}'

编辑:啊,我错过了你的评论,你需要它们在一行上...
echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}'

那个执行这个操作。


1

"Ayman Hourieh"和"Shawn Chin"的答案中有一个补充,以防需要存储目录以外的内容。

在较新版本的bash中,您可以使用mapfile将目录存储到数组中。请参见help mapfile

mapfile -t files_in_dir < <( ls )

如果您完全想要在bash中使用,可以使用printf "%s\n" *代替ls,或者只需将ls替换为您需要的任何其他命令。
现在,您可以像往常一样访问数组并获取所需数据。
第一个元素:
${files_in_dir[0]}

最后一个元素(冒号后面不要忘记空格):

${files_in_dir[@]: -1}

范围,例如从10到20:

${files_in_dir[@]:10:20}

对于大目录,请注意,这种方法比其他解决方案更消耗内存。


这实际上回答了所提出的问题。 - Alcamtar

1

以交互方式执行:

set $FILES && eval eval echo \\\${1..10}

要将其作为脚本运行,请创建foo.sh并添加以下内容:

N=$1; shift; eval eval echo \\\${1..$N}

然后运行:

bash foo.sh 10 $FILES


0
FILES=$(ls)
echo $FILES | fmt -1 | head -10

2
如果文件名中有空格,则不会按预期工作。 - Ayman Hourieh
我知道这一点,但是我认为dehmann想要使用这种特定的方法,所以我认为空格不会成为问题。顺便问一下,你是指FILES=(*) echo "${FILES[@]:0:10}"?在这里它的效果更好。 - sunny256

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接