2016-08-24 111 views
1

我正在尝试使bash脚本循环遍历目录中的所有文件,并将它们单独压缩到另一个目录。Bash通过目录和zip中的文件循环

目前我有这样的:

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包括源文件的绝对路径,所以我的输出文件在/媒体/用户/存储/拉链/媒体结束/ user/storage/unzipped/

如何从$ f变量中只提取名称?

+0

谢谢大家,我觉得现在愚蠢的不知道基名! 有几个人有相同的(正确的)答案,所以我将最古老的(最详细的)标记为已接受! – rtho782

回答

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 
+0

在循环的开头添加'fb = $(basename $ f)'会更好,并且使用$ fb而不是$ f – AstraSerg

0

您需要从提取文件名路径:

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 
0

您可以使用所谓的Paramete [R扩展,我相信这是你不错的使用:

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

+0

太棒了!这实际上保存了我问另一个关于从sha256sum的输出中剥离文件名的问题:) – rtho782

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##*/}为您提供该文件的基本名称。参见参数[ expansion ]
  3. 双引号变量来防止[ word splitting ]
+1

幸运的是,我不需要拾取目录,但我最终需要使用nullglob,否则如果目录为空,它会尝试压缩其他的东西,谢谢! – rtho782

+0

@ rtho782:好记... – sjsam