在bash
中,如何打印列表的第一个n
元素?
例如,此列表中的前10个文件:
FILES=$(ls)
更新:我忘了说我要在一行打印元素,就像用echo $FILES
打印整个列表一样。
答案 0 :(得分:24)
FILES=(*)
echo "${FILES[@]:0:10}"
即使文件名中有空格,也应该正常工作。
FILES=$(ls)
创建一个字符串变量。 FILES=(*)
创建一个数组。有关examples on using arrays in bash的更多信息,请参阅此页面。 (感谢lhunath)
答案 1 :(得分:5)
FILE="$(ls | head -1)"
我尝试时也正确处理了文件名中的空格。
答案 2 :(得分:4)
为什么不打印前50个文件:
ls -1 | head -50
答案 3 :(得分:2)
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}'
编辑:AAh,错过了你在一条线上需要它们的评论...
echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}'
那个人那样做。
答案 4 :(得分:2)
我的方式是:
ls | head -10 | tr "\n" " "
这将打印ls返回的前10行,然后tr用空格替换所有换行符。输出将在一行上。
答案 5 :(得分:1)
以交互方式进行:
set $FILES && eval eval echo \\\${1..10}
将其作为脚本运行,创建包含内容的foo.sh
N=$1; shift; eval eval echo \\\${1..$N}
并将其作为
运行 bash foo.sh 10 $FILES
答案 6 :(得分:0)
FILES=$(ls)
echo $FILES | fmt -1 | head -10
答案 7 :(得分:0)
“ 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}
注意大型目录,这比其他解决方案消耗更多的内存。