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