2016-08-24 76 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