我正在尝试遍历目录及其子目录以提取文件。下面的代码工作正常,但是,全局变量“ DECOMPRESSED_FILES_COUNTER”仅在第一个目录内递增。 忽略“ IS_EXTRACTED”变量(这是其他用途) 这是我脚本的一小部分:
FILE_OUTPUT_HIDE=/dev/null 2>&1
DECOMPRESSED_FILES_COUNTER=0
CURRENT_PATH=$(pwd)
function extractFiles(){
IS_EXTRACKED=""
if ( file "$FILE_I" | grep -w 'zip' >$FILE_OUTPUT_HIDE )
then
unzip -o $FILE_I >$FILE_OUTPUT_HIDE
let "DECOMPRESSED_FILES_COUNTER++"
elif ( file "$FILE_I" | grep -w 'gzip' >$FILE_OUTPUT_HIDE )
then
gunzip -k -f -N $FILE_I >$FILE_OUTPUT_HIDE
let "DECOMPRESSED_FILES_COUNTER++"
elif ( file "$FILE_I" | grep -w 'bzip2' >$FILE_OUTPUT_HIDE )
then
bzip2 -k -d -f $FILE_I >$FILE_OUTPUT_HIDE
let "DECOMPRESSED_FILES_COUNTER++"
else
IS_EXTRACKED=false
fi
}
function recursiveMode(){
for FILE_I in *; do
if [ -d "$FILE_I" ]; then
(cd -- "$FILE_I" && recursiveMode)
fi
extractFiles
done
}
示例:
omri @ omri-pc:/ mnt / c / users / omri / mission $ ./myScript -r newFolder
假设“ newFolder”具有3个归档文件,而其子文件夹“ otherFolder”具有2个归档文件。
我希望DECOMPRESSED_FILES_COUNTER为5,但即使提取了所有文件,实际值为3。
答案 0 :(得分:1)
您用于在目录中本地化更改的子Shell导致对变量的更改仅保留在该子Shell中。使用pushd
和popd
来更改和还原工作目录。
function recursiveMode(){
for FILE_I in *; do
if [ -d "$FILE_I" ]; then
pushd "$FILE_I"
recursiveMode
popd
fi
extractFiles
done
}
但是,考虑到您使用的仅bash
个功能,您也可以使用另一个功能:**
glob模式为您进行递归。
shopt -s globstar
counter=0
extractFile () {
if file "$1" | grep -qw bzip2; then
bzip2 -k -d -f "$1"
elif file "$1" | grep -qw gzip; then
gunzip -k -f -N "$1"
elif file "$1" | grep -qw zip; then
unzip -o "$1"
else
return
fi > /dev/null
((counter++))
}
for f in **/*; do
extractFile "$f"
done