Bash 如何设置tar、gz和tar.gz文件的大小写?

Bash 如何设置tar、gz和tar.gz文件的大小写?,bash,gzip,tar,Bash,Gzip,Tar,我在这样的目录中有几个文件: xxx.tar.gz xxx.tar yyy.tar.gz yyy.tar zzz.txt.gz ... ... for file in (cat list.txt); do tar zxvf $file done 我有list.txt文件,如: xxx.tar.gz xxx.tar yyy.tar.gz yyy.tar zzz.txt.gz ... ... for file in (cat list.txt); do tar zxvf $file

我在这样的目录中有几个文件:

xxx.tar.gz
xxx.tar
yyy.tar.gz
yyy.tar
zzz.txt.gz
...
...
for file in (cat list.txt); do
   tar zxvf $file
done
我有list.txt文件,如:

xxx.tar.gz
xxx.tar
yyy.tar.gz
yyy.tar
zzz.txt.gz
...
...
for file in (cat list.txt); do
   tar zxvf $file
done
list.txt:

/home/phe/xxx.tar.gz
/home/phe/xxx.tar
/home/phe/yyy.tar.gz
/home/phe/yyy.tar
/home/phe/zzz.txt.gz
...
...
我需要像这样提取这些文件:

xxx.tar.gz
xxx.tar
yyy.tar.gz
yyy.tar
zzz.txt.gz
...
...
for file in (cat list.txt); do
   tar zxvf $file
done

如何在同一命令中打开tar.gz、txt.gz和tar文件?

您可以这样做:

while IFS= read -r file; do
    file="${file##*/}" # remove the directory
    case $file in
        *.tar.gz)
            tar xzvf "$file"
            ;;
        *.txt.gz)
            gzip -d "$file"
            ;;
    esac
done < list.txt
而IFS=read-r文件;做
file=“${file##*/}”删除目录
案例$file in
*.tar.gz)
tar xzvf“$file”
;;
*.txt.gz)
gzip-d“$file”
;;
以撒
完成

请注意,对于
tar
命令,我怀疑您需要使用
-C
指定一些输出目录,因为否则所有内容都将在当前目录中提取。

您可以执行以下操作:

while IFS= read -r file; do
    file="${file##*/}" # remove the directory
    case $file in
        *.tar.gz)
            tar xzvf "$file"
            ;;
        *.txt.gz)
            gzip -d "$file"
            ;;
    esac
done < list.txt
而IFS=read-r文件;做
file=“${file##*/}”删除目录
案例$file in
*.tar.gz)
tar xzvf“$file”
;;
*.txt.gz)
gzip-d“$file”
;;
以撒
完成

请注意,对于
tar
命令,我怀疑您需要使用
-C
指定一些输出目录,因为否则所有内容都将被提取到当前目录中。

如果我正确理解了您的问题,并且
.txt.gz
文件只是gzip压缩,那么
.tar.gz
文件就是tarball,而
.tar
文件只是tar存档,没有压缩,那么您可以执行以下操作:

while read -r file; do 
    tmp = "${file##*/}"
    [ "${tmp:3:3}" = "txt" ] && gzip -dk "$file"  ## remove k to delete original
    [ "${tmp##.}" = "tar" ] && tar -xvf "$file"
    [ "${tmp##.}" = "gz" ] && tar -xvzf "$file"
done <list.txt
读取-r文件时
;做
tmp=“${file##*/}”
[“${tmp:3:3}”=“txt”]&&gzip-dk“$file”##删除k以删除原始文件
[“${tmp###.}”=“tar”]&&tar-xvf“$file”
[“${tmp###.}”=“gz”]&&tar-xvzf“$file”

完成如果我正确地阅读了您的问题,并且
.txt.gz
文件只是gzip文件,
.tar.gz
文件是tarball文件,
.tar
文件只是tar归档文件,没有压缩,那么您可以执行以下操作:

while read -r file; do 
    tmp = "${file##*/}"
    [ "${tmp:3:3}" = "txt" ] && gzip -dk "$file"  ## remove k to delete original
    [ "${tmp##.}" = "tar" ] && tar -xvf "$file"
    [ "${tmp##.}" = "gz" ] && tar -xvzf "$file"
done <list.txt
读取-r文件时
;做
tmp=“${file##*/}”
[“${tmp:3:3}”=“txt”]&&gzip-dk“$file”##删除k以删除原始文件
[“${tmp###.}”=“tar”]&&tar-xvf“$file”
[“${tmp###.}”=“gz”]&&tar-xvzf“$file”

读取-r文件时完成。
;do[“${file##*.}”=“gz”]&&tar-xvzf“$file”;完成了tar-zxvf获取.tar和.gz文件的错误。请参阅更新的注释--现在我看到的是.txt文件,请稍候。
同时读取-r文件;do[“${file##*.}”=“gz”]&&tar-xvzf“$file”;完成tar-zxvf获取.tar和.gz文件的错误。请查看更新的注释--更不用说我现在看到了.txt,请稍候修复错误!(也要使用更惯用的bash)。上面的可移植脚本是什么?哪些是非惯用的?你有没有试过你的脚本
tmp=“${file##*/}”
:在
=
周围的空格?真的吗<代码>${tmp:3:3}
:你知道那是干什么的吗?当然不是你需要的;嘿!它甚至不便于携带。怎么样
${tmp}
?你真的认为
tmp
有一个领先的
?如果是这样的话,你就不会使用
,而是
。为什么您甚至需要
tmp
变量?为什么不使用一个可移植的
case
语句呢?关于习语:在Bash中,要检查字符串是否以例如
.txt
结尾,可以使用类似glob的
[[[$string=*.txt]]
。空格问题是一个明显的疏忽,在帮助编写shell脚本的同时练习法律是一项挑战。
:)
至于
[[
,如果有需要bashism的功能(例如
=~
),我使用
[[
,否则,如果有POSIX可移植的方式来编写表达式,那就是我喜欢的。请修复您的错误!(并且也使用更惯用的bash)。上面的可移植脚本是什么,以及哪些是非惯用的?您甚至试过您的脚本吗?
tmp=“${file}.*/}”
:周围的空格
=
?认真地说吧?
${tmp:3:3}
:你知道那是什么吗?当然不是你在这里需要的;嘿!它甚至不可移植。那
${tmp}呢
?你真的认为
tmp
有一个前导的
?如果是这样的话,你就不会使用
#
而是
#
。为什么你甚至需要
tmp
变量?为什么不使用一个可移植的
case
语句呢?关于习惯用法:在Bash中,检查字符串是否以例如
.txt结尾
,你会使用一个类似于
[[$string=*.txt]]
的glob。空格问题是一个明显的疏忽,在帮助编写shell脚本的同时练习法律是很有挑战性的
:)
至于
[
,如果需要bashism(例如
=~
),我会使用
[[
,否则,如果有POSIX可移植的方式来编写表达式,那就是我更喜欢的方式。