我正在尝试使用bash脚本遍历目录中的所有文件,并将它们单独压缩到另一个目录。
目前我有这个:
FILES=/media/user/storage/unzipped/*
for f in $FILES
do
7za a -t7z /media/user/storage/zipped/$f.7z $f -mx9 -r -ppassword -mhe
done
问题是变量$ f包含源文件的绝对路径,因此我的输出文件最终在/ media / user / storage / zipped / media / user / storage / unzipped /
中如何仅从$ f变量中提取名称?
答案 0 :(得分:1)
您需要从路径中提取文件名:
FILES=/media/user/storage/unzipped/*
for f in $FILES
do
filename=$(basename "$f")
7za a -t7z /media/user/storage/zipped/${filename}.7z $f -mx9 -r -ppassword -mhe
done
答案 1 :(得分:0)
您可以使用basename
功能:
FILES=/media/user/storage/unzipped/*
for f in $FILES
do
7za a -t7z "/media/user/storage/zipped/$(basename $f).7z" $f -mx9 -r -ppassword -mhe
done
但是,您可能会遇到子文件夹中的文件问题,因此您可以更改wordking目录:
#record current dir
OWD=$(pwd)
# move to interesting directory
cd /media/user/storage/unzipped
# zip
for f in *
do
7za a -t7z /media/user/storage/zipped/$f.7z $f -mx9 -r -ppassword -mhe
done
# restore dir
cd $OWD
答案 2 :(得分:0)
您可以使用所谓的参数展开,我相信这对您有用:
FILES=/media/user/storage/unzipped/*
for f in $FILES
do
7za a -t7z /media/user/storage/zipped/${f##*/}.7z $f -mx9 -r -ppassword -mhe
done
有关参数扩展的更多信息 - here
答案 3 :(得分:0)
要在/media/user/storage/unzipped/
中递归查找文件,请使用nullglob
shopt -s nullglob
for f in /media/user/storage/unzipped/** # See [1]
do
[ -f "$f" ] && 7za a -t7z "/media/user/storage/zipped/${f##*/}.7z" "$f" -mx9 -r -ppassword -mhe # See [2]
done
shopt -u nullglob
<强>参考强>
**
以递归方式查找给定目录下可能包含目录的任何内容,因此在下一步中检查$f
是否确实是文件([ -f "$f" ]
),然后将其压缩${f##*/}
为您提供文件的基本名称。请参阅param [ expansion ]。