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>
你有什么主意可以给我吗?
2条答案
按热度按时间ktca8awb1#
由于您熟悉参数替换,我将从消除用于查找
EXT
的双重子进程调用的开销开始;代码更短,但性能也有所提高,因为这不需要生成/清理任何子进程(for each 通过循环):**注意:**这假定所有文件都有一个扩展名(例如,
.tgz
而不是tar.gz
),否则OP可能需要添加更多逻辑来确定如何处理具有多个扩展名的文件(例如,abc.tar.gz
与a.b.c.tar.gz
)下一个想法是将
mkdir
逻辑单独拉出;这消除了4 × 1 M6 N1 X线:绕了一小圈...
OP提到希望使用数组来管理扩展列表,虽然这种方法是可行的,但它还需要考虑如何存储和引用相关命令。
假设这将是唯一需要处理扩展列表的代码片段,我可能会选择对每个扩展的逻辑进行“硬编码”(而不是存储在资源/配置文件中,然后加载到数组中)。
返回代码(重新)设计...
下一个想法是将
tar
调用折叠成一个带有bz2
测试的单个调用;这消除了3个测试和3个x1M9 N1 X线:就我个人而言,我可能会选择
case
语句:把这一切放在一起:
68de4m5k2#
把这个贴出来作为另一个例子,让其他人看到,这是我在看到markp-fuso的伟大例子后想到的。
这次我在列表中添加了zip文件。