如何从文件夹中删除版本号
How to remove a version number from a folder
我在这样的目录中构建了一个安装程序:
install-0.1.tar.gz
install-0.2.tar.gz
install-0.3.tar.gz
我想 运行 一行将其中一个压缩包解压到一个文件夹中,如下所示:
install
install-0.1.tar.gz
install-0.2.tar.gz
install-0.3.tar.gz
解压缩并重命名文件夹是重要的一点。
感谢帮助
下面是一个 bash 函数,它试图覆盖极端情况。
它不止一行,但那是因为它得到了所有的细节——查看目标是否已经存在,检测包含多个目录的 tarball,等等。
# this requires bash; if encapsulating in a script, use #!/bin/bash
unpack() {
declare tempdir dest
declare -a contents
if [[ ]]; then
dest=
elif [[ = *-* ]]; then
dest=${1%-*}
else
echo "ERROR: Filename must include a dash, or explicit destination must be given" >&2
exit 1
fi
[[ -e $dest ]] && {
echo "ERROR: $dest already exists" >&2
return 1
}
tempdir=$(mktemp -d "${TMPDIR:-/tmp}"/unpack.XXXXXX)
tar -xzf "" -C "$tempdir" || {
rm -rf "$tempdir"
echo "ERROR: Unpack failed" >&2
return 1
}
contents=("$tempdir"/*)
(( ${#contents[@]} > 1 )) && {
# rename the tempdir we unpacked into to our destination
mv -- "$tempdir" "$dest"
return
}
mv -- "$contents" "$dest"
rm -rf "$tempdir"
}
运行 如:
unpack install-0.3.tar.gz # put contents of tarball into directory named install
...或...
unpack install-0.3.tar.gz outdir # put contents of tarball into directory named outdir
把这个函数写成脚本,只需要加一个开头的#!/bin/bash
,去掉unpack() {
和结尾的}
,把return
改成[=17] =] 无处不在。
假设 tarball 包含名为 install
:
的文件夹
tar xzf install-<version>.tar.gz
如果它包含文件夹中的版本:
tar xzf install-<version>.tar.gz --transform='s/<version>//g'
#!/usr/local/bin/bash
# Change the above line to match your bash path.
let "filename="
let "dirname=$(echo ${filename} | sed s'@\.tar\.gz@@'g)"
mkdir install
tar zxvf "${filename}"
cp -a "${dirname}/*" install
cd "${dirname}"
rm -rf ./*
cd ..
我认为这应该可行。
应该这样做:
filename="install-0.1.tar.gz"
foldername="${filename%%-*}"
mkdir -p "$foldername"
tar xzf "$filename" -C "$foldername"
在这种情况下,文件名中的 -
至关重要。 $foldername
.
之后的所有内容都将被忽略
我在这样的目录中构建了一个安装程序:
install-0.1.tar.gz
install-0.2.tar.gz
install-0.3.tar.gz
我想 运行 一行将其中一个压缩包解压到一个文件夹中,如下所示:
install
install-0.1.tar.gz
install-0.2.tar.gz
install-0.3.tar.gz
解压缩并重命名文件夹是重要的一点。 感谢帮助
下面是一个 bash 函数,它试图覆盖极端情况。
它不止一行,但那是因为它得到了所有的细节——查看目标是否已经存在,检测包含多个目录的 tarball,等等。
# this requires bash; if encapsulating in a script, use #!/bin/bash
unpack() {
declare tempdir dest
declare -a contents
if [[ ]]; then
dest=
elif [[ = *-* ]]; then
dest=${1%-*}
else
echo "ERROR: Filename must include a dash, or explicit destination must be given" >&2
exit 1
fi
[[ -e $dest ]] && {
echo "ERROR: $dest already exists" >&2
return 1
}
tempdir=$(mktemp -d "${TMPDIR:-/tmp}"/unpack.XXXXXX)
tar -xzf "" -C "$tempdir" || {
rm -rf "$tempdir"
echo "ERROR: Unpack failed" >&2
return 1
}
contents=("$tempdir"/*)
(( ${#contents[@]} > 1 )) && {
# rename the tempdir we unpacked into to our destination
mv -- "$tempdir" "$dest"
return
}
mv -- "$contents" "$dest"
rm -rf "$tempdir"
}
运行 如:
unpack install-0.3.tar.gz # put contents of tarball into directory named install
...或...
unpack install-0.3.tar.gz outdir # put contents of tarball into directory named outdir
把这个函数写成脚本,只需要加一个开头的#!/bin/bash
,去掉unpack() {
和结尾的}
,把return
改成[=17] =] 无处不在。
假设 tarball 包含名为 install
:
tar xzf install-<version>.tar.gz
如果它包含文件夹中的版本:
tar xzf install-<version>.tar.gz --transform='s/<version>//g'
#!/usr/local/bin/bash
# Change the above line to match your bash path.
let "filename="
let "dirname=$(echo ${filename} | sed s'@\.tar\.gz@@'g)"
mkdir install
tar zxvf "${filename}"
cp -a "${dirname}/*" install
cd "${dirname}"
rm -rf ./*
cd ..
我认为这应该可行。
应该这样做:
filename="install-0.1.tar.gz"
foldername="${filename%%-*}"
mkdir -p "$foldername"
tar xzf "$filename" -C "$foldername"
在这种情况下,文件名中的 -
至关重要。 $foldername
.