AWK使用变量,而不是文件

AWK使用变量,而不是文件,awk,Awk,我读过这篇文章,但我不知道如何制作我需要的东西。 我有一个变量,它是一个路径,所以我想知道文件名(如果我用/分隔,则最后一列) 所以我尝试了几种组合,比如: #!/bin/sh source=$1 target=$2 for i in "$source"/* do $name = awk -F/ -v '{ print $NF }' $i echo $name done 但是没有成功,有人能帮我吗??提前谢谢有点不清楚。。。是否要从路径中提取文件名 要获取没有文件名的路径

我读过这篇文章,但我不知道如何制作我需要的东西。 我有一个变量,它是一个路径,所以我想知道文件名(如果我用
/
分隔,则最后一列)

所以我尝试了几种组合,比如:

#!/bin/sh

source=$1
target=$2


for i in "$source"/*
do
    $name = awk -F/ -v '{ print $NF }' $i
    echo $name
done

但是没有成功,有人能帮我吗??提前谢谢

有点不清楚。。。是否要从路径中提取文件名

要获取没有文件名的路径,请使用
dirname

$ dirname /usr/bin/foo.bar
/usr/bin
要获取没有路径的文件名,请使用
basename

$ basename /usr/bin/foo.bar
foo.bar
使用awk:

$ echo $a 
/usr/bin/foo.bar  

$ echo $a | awk -F/ '{print $NF}' 
foo.bar

有点不清楚。。。是否要从路径中提取文件名

要获取没有文件名的路径,请使用
dirname

$ dirname /usr/bin/foo.bar
/usr/bin
要获取没有路径的文件名,请使用
basename

$ basename /usr/bin/foo.bar
foo.bar
使用awk:

$ echo $a 
/usr/bin/foo.bar  

$ echo $a | awk -F/ '{print $NF}' 
foo.bar

您可以只使用shell来提取文件名,而无需外部工具

for file in $source/*
do
  echo ${file##*/}
done

您可以只使用shell来提取文件名,而无需外部工具

for file in $source/*
do
  echo ${file##*/}
done

如果要提取文件名,请按照Fredrik的建议使用basename。以下是一个解决方案:

#!/bin/sh

source=$1
target=$2

for i in "$source"/*
do
    name=$(basename $i)
    echo $name
done
#!/bin/sh

source=$1
target=$2

pushd "$source" >/dev/null 2>&1
for name in *
do
    echo $name
done
popd >/dev/null 2>&1
这个解决方案可以工作,但它有一个bug:如果目录或文件的名称中包含空格,那么它就不能正常工作。以下是我修改后的解决方案:

#!/bin/sh

source=$1
target=$2

for i in "$source"/*
do
    name=$(basename $i)
    echo $name
done
#!/bin/sh

source=$1
target=$2

pushd "$source" >/dev/null 2>&1
for name in *
do
    echo $name
done
popd >/dev/null 2>&1

注意,我使用pushd/popd进出源目录。因为我已经在源目录中,所以我不需要调用basename。

如果要提取文件名,请按照Fredrik的建议使用basename。以下是一个解决方案:

#!/bin/sh

source=$1
target=$2

for i in "$source"/*
do
    name=$(basename $i)
    echo $name
done
#!/bin/sh

source=$1
target=$2

pushd "$source" >/dev/null 2>&1
for name in *
do
    echo $name
done
popd >/dev/null 2>&1
这个解决方案可以工作,但它有一个bug:如果目录或文件的名称中包含空格,那么它就不能正常工作。以下是我修改后的解决方案:

#!/bin/sh

source=$1
target=$2

for i in "$source"/*
do
    name=$(basename $i)
    echo $name
done
#!/bin/sh

source=$1
target=$2

pushd "$source" >/dev/null 2>&1
for name in *
do
    echo $name
done
popd >/dev/null 2>&1
注意,我使用pushd/popd进出源目录。因为我已经在源目录中,所以我不需要调用basename