如何使用错误的扩展名提取所有档案?

时间:2017-09-20 06:00:56

标签: bash

我必须提取当前文件夹中的所有档案。我正在做的只是提取所有正确命名但存档可能有任何混乱的扩展名。

file.tar.gvz

或file.tar.potatogz

或file.sss.faz

  gunzip *.tar.gz >/dev/null 2>/dev/null
  echo $?
  echo "gzip"
  tar -xvf *.tar >/dev/null 2>/dev/null
  echo $?
  echo "tar"
  unzip '*.zip' >/dev/null 2>/dev/null
  echo $?
  echo "zip"

编辑:  文件命令似乎是正确的方法,但我不能让它在嵌套循环中工作。当在目录循环之外时,它可以正常工作。

for D in *; do
  if [ -d "${D}" ]; then
    cd $D
    bool=false
      for files in *
      do
        type=$( file -b $files | awk '{printf $1;}' )
        echo "next is type"
        echo $type
        done
       cd..
 done

3 个答案:

答案 0 :(得分:1)

File命令解决了这个问题。 我的文件问题用引号解决了。

  type=$( file -b "$j" | awk '{printf $1;}' )

答案 1 :(得分:1)

当gunzip从stdin读取时,它不知道文件名错误:

cat archive_with_wrong_name | gunzip -c 

甚至更容易......

gunzip -c <archive_with_wrong_name

甚至更容易......

gzcat archive_with_wrong_name

答案 2 :(得分:0)

看起来你真的很亲密。这样的事情怎么样?

for D in *; do
    if [ -d "${D}" ]; then
        cd $D
        for file in *; do
            type="$( file -b "$file" | awk '{print $1}' )"
            case "$type" in
                'gzip' ) gunzip $file; continue ;;
                'zip' ) unzip $file; continue ;;
                'tar' ) tar xzf $file; continue ;;
                '*' ) continue ;;
            esac
        done
        cd ..
    fi           
done