我正在编写一个脚本,其中文件中有 .zip 文件和 .tar.gz 文件。我必须提取文件。我知道如何使用 tar 作为 tar.gz 并使用 unzip 作为 zip 文件,但不知道如何根据扩展名做出决定。我编写了一个适用于 tar.gz 的脚本。这是脚本。
#!/bin/bash
echo "Evaluate Lab"
select yn in "Yes" "No";
do
case $yn in
Yes )
echo "Evaluating!!"
#choose file
file="$(ls | head -1)"
echo $file
mkdir temp
echo "Decompressing file $file"
#Decompress chosen tar.gz to temp
tar -xf "$file" --directory temp
cd temp/
#Do some work here
#get out of temp folder
cd ../
rm -rf temp
echo "Moving $file to done"
mv "$file" ../done/
echo "Evaluate another"
echo "1) Yes 2) No"
;;
No )
echo "Exiting...."
exit;;
*)
echo "Enter right option";;
esac
done
我必须同时处理 tar.gz 和 zip 。有什么提示吗?
答案1
以下是您的脚本的变体:
#!/bin/sh
mkdir -p "done"
for file in ./*.tar.gz ./*.zip; do
printf 'Press Enter to process %s, or Ctrl+C to quit\n' "$file"
read bogus
tmpdir=$(mktemp -d)
printf 'Decompressing %s into %s\n' "$file" "$tmpdir"
case $file in
*.tar.gz) tar -xz -f "$file" -C "$tmpdir" ;;
*.zip) unzip "$file" -d "$tmpdir" ;;
esac
(
cd "$tmpdir"
# do work here
)
rm -rf "$tmpdir"
mv "$file" "done"
done
它迭代当前目录中的所有文件.tar.gz
。.zip
对于每个文件,将创建一个临时提取目录,并使用或根据文件名后缀mktemp -d
将文件提取到其中。tar
unzip
周围的子 shellcd
以及您需要对提取的数据执行的任何其他操作都允许您跳过将目录更改回开始的位置(更改后的工作目录是子 shell 的本地目录)。
我想这里最重要的是case ... esac
声明。这是一种根据字符串匹配的模式执行不同操作的方法。
也可以看看: