Bash 循环浏览目录和zip中的文件

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

我正在尝试创建一个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/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,否则如果目录为空,它会尝试压缩其他内容,谢谢!