Bash循环遍历目录和zip中的文件

时间:2016-08-24 07:30:58

标签: linux bash

我正在尝试使用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变量中提取名称?

4 个答案:

答案 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

<强>参考

  1. **以递归方式查找给定目录下可能包含目录的任何内容,因此在下一步中检查$f是否确实是文件([ -f "$f" ]),然后将其压缩
  2. ${f##*/}为您提供文件的基本名称。请参阅param [ expansion ]
  3. 双引号变量以防止[ word splitting ]