在 bash
中,我该如何打印出列表的前 n
个元素?
比如说,这个列表中的前10个文件:
FILES=$(ls)
更新:我忘了说我想要把元素打印在一行上,就像你用echo $FILES
打印整个列表时一样。
FILES=(*)
echo "${FILES[@]:0:10}"
如果文件名中有空格也应该正常工作。
FILES=$(ls)
创建一个字符串变量。FILES=(*)
创建一个数组。在这个页面上查看更多有关在bash中使用数组的示例。(感谢lhunath)
ls
进程,当你可以使用 globbing(通配符扩展)呢? - Ayman Houriehls -1 | head -50
FILE="$(ls | head -1)"
当我尝试时,也能正确处理文件名中的空格。
$(ls -1 | head -1)
? - nh2我的做法是:
ls | head -10 | tr "\n" " "
-1
,例如ls -1 | head -10 | tr "\n" " "
。无论如何,这就是我要找的 ;) - silgonecho $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}'
echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}'
那个执行这个操作。
"Ayman Hourieh"和"Shawn Chin"的答案中有一个补充,以防需要存储目录以外的内容。
在较新版本的bash中,您可以使用mapfile将目录存储到数组中。请参见help mapfile
mapfile -t files_in_dir < <( ls )
printf "%s\n" *
代替ls
,或者只需将ls
替换为您需要的任何其他命令。${files_in_dir[0]}
最后一个元素(冒号后面不要忘记空格):
${files_in_dir[@]: -1}
范围,例如从10到20:
${files_in_dir[@]:10:20}
对于大目录,请注意,这种方法比其他解决方案更消耗内存。
以交互方式执行:
set $FILES && eval eval echo \\\${1..10}
要将其作为脚本运行,请创建foo.sh并添加以下内容:
N=$1; shift; eval eval echo \\\${1..$N}
然后运行:
bash foo.sh 10 $FILES
FILES=$(ls)
echo $FILES | fmt -1 | head -10