shell 如果在for命令的每个循环中匹配成功,则更改变量的输出

sbdsn5lh  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(150)

Startup action:
我正在尝试创建一个函数,我将使用.bash_functions调用该函数,该函数源自我的.bashrc文件。
Goal:
我正在努力减少所需的代码量。如果我用重复的命令制作一个函数,而这些命令对每个命令行都有(大部分是微小的)差异,我最终会得到一个巨大的函数...
Purpose of function:
该函数将在当前工作目录中搜索与预定义扩展名数组匹配的文件。如果找到具有匹配扩展名的文件,它将执行特定的自定义命令行。如果找到具有不同扩展名的另一个匹配文件,则必须使用另一种类型的命令,而不是前面提到的第一个命令,依此类推。
If the following files are in the current working directory:

file1.7z
file2.bz2
file3.gz
file4.tgz
file5.xz

Then running the function in a terminal will output the following lines:

7z x -o/root/file1 /root/file1.7z
tar -xvfj /root/file2.bz2 -C /root/file2
tar -xvf /root/file3.gz -C /root/file3
tar -xvf /root/file4.tgz -C /root/file4
tar -xvf /root/file5.xz -C /root/file5

Where I am at so far:
我还没有设置数组,因为我一直在计算正确循环命令的流程。我有下面的脚本,它做了我想要的,但是就像我提到的,我想精简它,如果可能的话(从你们那里学习一些新技巧)!

untar()
{
    clear
    for i in *.*
    do
            local EXT="$(echo "${i}" | sed 's/.*\.//')"
            if [ -n "${EXT}" ]; then
            if [[ "${EXT}" == '7z' ]]; then
                if [ ! -d "${PWD}"/"${i%%.*}" ]; then mkdir -p "${PWD}"/"${i%%.*}"; fi
                echo 7z x -o"${PWD}"/"${i%%.*}" "${PWD}"/"${i}"
            elif [[ "${EXT}" == 'bz2' ]]; then
                if [ ! -d "${PWD}"/"${i%%.*}" ]; then mkdir -p "${PWD}"/"${i%%.*}"; fi
                echo tar -xvfj "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
            elif [[ "${EXT}" == 'gz' ]]; then
                if [ ! -d "${PWD}"/"${i%%.*}" ]; then mkdir -p "${PWD}"/"${i%%.*}"; fi
                echo tar -xvf "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
            elif [[ "${EXT}" == 'tgz' ]]; then
                if [ ! -d "${PWD}"/"${i%%.*}" ]; then mkdir -p "${PWD}"/"${i%%.*}"; fi
                echo tar -xvf "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
            elif [[ "${EXT}" == 'xz' ]]; then
                if [ ! -d "${PWD}"/"${i%%.*}" ]; then mkdir -p "${PWD}"/"${i%%.*}"; fi
                echo tar -xvf "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
            fi
        fi
    done;
}

Required to function:
本质上,需要两个不同的tar命令和一个7z命令(就我所能想到的而言)

Command 1: tar -xvf <target.{gz,tgz,xz}> -C <output folder> 
Command 2: tar -xvfj <target.bz2> -C <output folder> 
Command 3: 7z x -o<output folder> <target.7z>

你有什么主意可以给我吗?

ktca8awb

ktca8awb1#

由于您熟悉参数替换,我将从消除用于查找EXT的双重子进程调用的开销开始;代码更短,但性能也有所提高,因为这不需要生成/清理任何子进程(for each 通过循环):

local EXT="${i##*.}"

**注意:**这假定所有文件都有一个扩展名(例如,.tgz而不是tar.gz),否则OP可能需要添加更多逻辑来确定如何处理具有多个扩展名的文件(例如,abc.tar.gza.b.c.tar.gz

下一个想法是将mkdir逻辑单独拉出;这消除了4 × 1 M6 N1 X线:

if [ ! -d "${PWD}"/"${i%%.*}" ]; then mkdir -p "${PWD}"/"${i%%.*}"; fi

# or

[[ ! -d "${PWD}"/"${i%%.*}" ]] && mkdir -p "${PWD}"/"${i%%.*}"

绕了一小圈...
OP提到希望使用数组来管理扩展列表,虽然这种方法是可行的,但它还需要考虑如何存储和引用相关命令。
假设这将是唯一需要处理扩展列表的代码片段,我可能会选择对每个扩展的逻辑进行“硬编码”(而不是存储在资源/配置文件中,然后加载到数组中)。
返回代码(重新)设计...
下一个想法是将tar调用折叠成一个带有bz2测试的单个调用;这消除了3个测试和3个x1M9 N1 X线:

if [[ "${EXT}" == '7z' ]]; then
     echo 7z x -o"${PWD}"/"${i%%.*}" "${PWD}"/"${i}"
else
     jflag=""
     [[ "${EXT}" == 'bz2' ]] && jflag="j"
     echo tar -xvf${jflag} "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
fi

就我个人而言,我可能会选择case语句:

case "${EXT}" in
    7z)
         echo 7z x -o"${PWD}"/"${i%%.*}" "${PWD}"/"${i}"
         ;;
    *)
         jflag=""
         [[ "${EXT}" == 'bz2' ]] && jflag="j"
         echo tar -xvf${jflag} "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
         ;;
esac

把这一切放在一起:

untar()
{
    clear
    local EXT

    for i in *.*
    do
        EXT="${i##*.}"

        [[ ! -d "${PWD}"/"${i%%.*}" ]] && mkdir -p "${PWD}"/"${i%%.*}"

        case "${EXT}" in
            7z)
                 echo 7z x -o"${PWD}"/"${i%%.*}" "${PWD}"/"${i}"
                 ;;
            *)
                 jflag=""
                 [[ "${EXT}" == 'bz2' ]] && jflag="j"
                 echo tar -xvf${jflag} "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
                 ;;
        esac
    done
}
68de4m5k

68de4m5k2#

把这个贴出来作为另一个例子,让其他人看到,这是我在看到markp-fuso的伟大例子后想到的。
这次我在列表中添加了zip文件。

untar()
{
    clear
    local EXT

    for i in *.*
    do
        EXT="${i##*.}"

        [[ ! -d "${PWD}"/"${i%%.*}" ]] && mkdir -p "${PWD}"/"${i%%.*}"

        case "${EXT}" in
            7z|zip)
                7z x -o"${PWD}"/"${i%%.*}" "${PWD}"/"${i}"
                 ;;
            bz2|gz|xz)
                jflag=""
                [[ "${EXT}" == 'bz2' ]] && jflag="j"
                tar -xvf${jflag} "${PWD}"/"${i}" -C "${PWD}"/"${i%%.*}"
                 ;;
        esac
    done
}

相关问题