我正在尝试制作一个命令,该命令允许用户将名称作为他们想要创建的压缩文件(将成为tar.gz文件)和文件输入的第一个参数和目录名称为第二个参数。
到目前为止,我有这个脚本
name_of_archive=$1
directory_or_file_paths=$2
if [ $# -eq 0 ]
then
echo "Usage: $0 [name of archive you wish to create] [path of directories or files you wish to compress]"
echo "You must enter atleast one file or directory name"
exit 1
else
if [ -e "$directory_or_file_paths" ] || [ -d "$directory_or_file_paths" ]
then
tar -czvf "$name_of_archive".tar.gz "$directory_or_file_paths"
echo "The filenames or directories you specified have been compressed into an archive called $name_of_archive.tar.gz"
else
echo "Some or all of the file or directory names you have given do not exist"
fi
exit
fi
这是我使用命令时得到的:
compression2.bash compression1 ./test ./listwaste
./test/
./test/test2/
./test/test2/2
./test/1
The filenames or directories you specified have been compressed into an archive called compression1.tar.gz
第一个是目录,第二个是文件。如果我尝试单独压缩这两个,但如果我尝试一次压缩多个文件,目录或混合物,则可以使用。我希望它能够做到。
将文件名存储在字符串中不是一个好主意。将它们存储在数组中是一种更好的方法:
#!/usr/bin/env bash
[[ $# -lt 2 ]] && exit 1
name=$1; shift
files=("$@")
#exclude all files/directories that are not readable
for index in "${!files[@]}"; do
[[ -r ${files[index]} ]] || unset "files[index]"
done
[[ ${#files[@]} -eq 0 ]] && exit 1
if tar -czvf "${name:-def_$$}.tar.gz" "${files[@]}"; then
echo "Ok"
else
echo "Error"
exit 1
fi
shift; files=("$@")
丢弃第一个参数(名称),并将其余的参数(文件名)保存到数组中。
您还可以采用更简单的方法来构造tar
的文件名数组:
name=$1; shift
for file; do
[[ -r $file ]] && files+=("$file")
done
这是因为您仅查看第二个参数并将其放入您的目录中。每当Linux在您的命令中找到一个空间时,它都将其视为另一个参数,因此您甚至都不会查看这些其他文件或文件夹。您需要做的是,如果参数的数量不是0,并且您将第一个作为您的name_of_archive,那么您将需要循环浏览所有剩余参数并构造一个包括它们的字符串,并由空格分开这就是您将作为tar命令的参数提供的。
我认为您要在将第一个输入输入到档案中的变量名称后使用Shift。然后,您可以通过整个列表,而不仅仅是存档的一个参数。
name_of_archive=$1
shift
directory_or_file_paths=("$@")
...
https://ss64.com/bash/shift.html