首页 > 解决方案 > 在bash中打印目录的文件名时出错

问题描述

所以我有这个基本程序,基本上它的作用是进入一个输入文件夹并打印那里的每个文件的名称和一个数字。问题是它打印文件的完整路径,我只想要文件的名称,并且由于某种原因,名称没有排序。

预期输出:

$ ./my_script.sh inputs bye 2
InputFile=test1.txt Num=1
InputFile=test1.txt Num=2
InputFile=test2.txt Num=1
InputFile=test2.txt Num=2
InputFile=test3.txt Num=1
InputFile=test3.txt Num=2
InputFile=test4.txt Num=1
InputFile=test4.txt Num=2

我的输出:

$ ./my_script.sh inputs bye 2
InputFile=inputs/test1.txt Num=1
InputFile=inputs/test1.txt Num=2
InputFile=inputs/test2.txt Num=1
InputFile=inputs/test2.txt Num=2
InputFile=inputs/test4.txt Num=1
InputFile=inputs/test4.txt Num=2
InputFile=inputs/test3.txt Num=1
InputFile=inputs/test3.txt Num=2

程序:

#!/bin/bash

Word1="${1}"
Word2="${2}"
Num="${3}"
for file in $(ls ${Word1}/*.txt)
do
    for i in $(seq 1 ${Num})
    do
        echo "InputFile="${file} "Num="${i}
    done
done

标签: bashshell

解决方案


不要解析 ls 的输出。而是使用 find 等:

find . -name "$word1*.txt" -printf "%f\n" 

%f 将仅显示文件名。

您还可以利用 awk 来实现您所需要的。

find -name "$word1*" -printf "%f\n" | awk -v num=$3 '{ for (i=1;i<=num;i++) { print "InputFile="$0" Num="num }}'

将 find 命令的输出通过管道传输到 awk。从 1 循环到由 num 确定的数字(传递给 awk 并设置为传递参数 $3 的变量)以所需格式打印 find 的每一行输出。


推荐阅读