Bash 循环浏览目录和zip中的文件
我正在尝试创建一个bash脚本来循环遍历一个目录中的所有文件,并将它们分别压缩到另一个目录中 目前我有:Bash 循环浏览目录和zip中的文件,bash,Bash,我正在尝试创建一个bash脚本来循环遍历一个目录中的所有文件,并将它们分别压缩到另一个目录中 目前我有: FILES=/media/user/storage/unzip/* 对于f,在$FILES中 做 7za a-t7z/media/user/storage/zipped/$f.7z$f-mx9-r-ppassword-mhe 完成 问题是变量$f包含源文件的绝对路径,因此我的输出文件最终位于/media/user/storage/zipped/media/user/storage/unzi
FILES=/media/user/storage/unzip/*
对于f,在$FILES中
做
7za a-t7z/media/user/storage/zipped/$f.7z$f-mx9-r-ppassword-mhe
完成
问题是变量$f包含源文件的绝对路径,因此我的输出文件最终位于/media/user/storage/zipped/media/user/storage/unzipped中/
如何仅从$f变量中提取名称?您可以使用
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
您需要从路径中提取文件名:
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
您可以使用所谓的参数扩展,我相信这对您很有用:
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
更多关于参数扩展的信息-有关在
/media/user/storage/unzip/
中递归查找文件的信息,请使用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最好在循环开始时添加
fb=$(basename$f)
,并使用$fb而不是$f谢谢大家,我现在不知道basename感觉很愚蠢!!有几个人有相同的(正确的)答案,所以我把最古老的(也是最详细的)一个标记为已接受!令人惊叹的!这实际上让我省去了另一个关于从sha256sum输出中剥离文件名的问题:)幸运的是,我不需要选择目录,但我最终需要nullglob,否则如果目录为空,它会尝试压缩其他内容,谢谢!