- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
(我会重复使用它,因为它是关于同一件事的)。
我已经设法制作了一个可用的脚本,它可以执行代码块下面解释的所有内容,除了参数的顺序,即:
./test.sh B N A
将删除B.zip
, 创建一个新的存档,但停在那里,A
不会被处理。没关系,我可以保留N
作为最后一个参数,没问题。此外,echo "no backup needed, removing"
由于某种原因不起作用,但这是可选的。
我的问题是:能否以某种方式改进/更改我所做的,以便如果及时添加其他文件夹,对脚本的唯一更改是 DIRx
条目?我看到的最大问题是修改 <start>
之间的 block 和 <stop>
.这是脚本:
#!/bin/bash
DIR1=A
DIR2=B
DIR3=C
bak()
{
if [[ "$*" == N ]]
then
if [ $1 == N ]
then
:
else
echo "no backup needed, removing"
rm -v $1.zip
fi
else
if
[ -f $1.zip ]
then
/bin/mv -vi $1.zip BKP/$1.zip_`/bin/date +"%H-%M"`
else
echo "no "$1".zip"
fi
fi
}
archive()
{
if [ $* == N ]
then
:
else
if [ $1 == C ]
then
7z a -mx=9 $1.zip ../path/$1 -r -x\!$1/nope
else
7z a -mx=9 $1.zip $1 -r -x\!$1/bogus
fi
fi
}
########### <start> ####################
if [ -z "$*" ] || [[ "$#" -eq 1 && "$1" == N ]]
then
bak "$DIR1"
bak "$DIR2"
bak "$DIR3"
archive "$DIR1"
archive "$DIR2"
archive "$DIR3"
fi
############## <stop> #####################
#if [[ "$#" -eq 1 && "$1" == N ]]
#then
# rm -v "$DIR1".zip
# rm -v "$DIR2".zip
# rm -v "$DIR3".zip
# archive "$DIR1"
# archive "$DIR2"
# archive "$DIR3"
#fi
if [[ "$#" -gt 1 && "$*" == *N* ]]
then
while [ "$#" -gt 1 ]
do
if [ "$1" == N ]
then
:
else
rm -v "$1".zip
fi
archive "$1"
shift
done
else
while [ "$#" -ge 1 ]
do
bak "$1"
archive "$1"
shift
done
fi
exit 0
现在,这就是我所拥有的和想要它做的。当前目录包含脚本,test.sh
, 和文件夹 A
和 B
. ls -AR
产生这个:
A B test.sh
./A:
1.txt 2.txt bogus
./B:
3.txt 4.txt bogus
还有另一个文件夹,C
, 在 ../path/
.同ls -AR ../path
给出这个:
../path:
C
../path/C:
5.txt 6.txt nope
../path/C/nope:
q.doc w.rtf
我希望脚本做什么。不带参数运行时:
./test.sh
1) 检查当前目录中的现有 zip 存档
1.a) 如果它们存在,则为每个备份,并在 BKP/.
中添加额外的日期后缀
2.a) 如果没有,它会让你知道
2) 三个文件夹,A
, B
和 C
已存档,文件夹 A
和 B
没有A/bogus
和 B/bogus
和文件夹 C
没有../path/C/nope/*
和 ../path/C/nope/
.
如果带参数运行,这些参数可以是 A
中的任何一个, B
或 C
, 带有可选的 N
.如果使用 N
运行, 只有:
./test.sh N
然后将不执行存档检查/备份,任何已存在的存档将被删除并且所有 3 个文件夹都将被存档。如果使用 A
的任意组合运行, B
或 C
,例如:
./test.sh A C
然后只存档A.zip
和 C.zip
进行检查和备份,只有文件夹 A
和 C
已存档,A
没有A/bogus
和 C
没有../path/C/nope/*
和 ../path/C/nope/
.如果使用 A
的任意组合运行, B
或 C
, 但有额外的 N
,即:
./test.sh B N C
然后不对B.zip
执行检查/备份和 C.zip
,文件(如果存在)被删除,文件夹 B
和 C
已存档。
存档将(在内部)文件夹作为根目录(即打开存档,您将首先看到 A
、 B
或 C
)并且这三个都在列表中有异常(exception)要处理的文件数:A
和 B
不需要bogus
, 而 C
不需要子文件夹 none
以及里面的任何东西。我用 7z
而不是 zip
因为我可以写:
7z a x.zip ../path/./C/bla/bla
并且有C
作为根目录;我无法用 zip
做到这一点(很可能我不知道怎么做,只要它有效就没关系)。
至此,检查和备份工作。归档,如果没有添加异常,我会删除 $PATH
事情,工作。整个脚本没有。我会发布我到目前为止所做的每一个组合,但其中 99% 可能是不可能的,其余的很幼稚。我不在乎它的外观,只要它能完成工作即可。
非常可选:可以为“Supercalifragilistic”创建别名(或某种别名),如“SCF”吗? C
文件夹有一个相当长的名字(我知道我可以做一个符号链接(symbolic link))。我对这个一无所知。
最佳答案
我成功了。这可能是非常幼稚和最糟糕的剧本,但我现在不在乎,它有效。当然,如果有人有更好的选择来分享,欢迎分享,在此之前这是整个脚本:
#!/bin/bash
# ./test.sh = 1. searches for existing archives
# 1.a. if they exist, it backups them into BKP/.
# 1.b. if not, displays a message
# 2. archives all the directories in the array list
# ./test.sh N = 1. deletes all the folder's archives existent and
# specified in the array list
# 2. archives all the directories in the array list
# ./test.sh {A..F} = 1. searches for existing archives from arguments
# 1.a. if they exist, it backups them into BKP/.
# 1.b. if not, displays a message
# 2. archives all the directories passed as arguments
# ./test.sh {A..F} N = 1. deletes all the archives matching $argument.zip
# 2. archives all the directories passed as arguments
# The directories to be backed-up/archived, all in the current (script's) path
# except "C", on a different path
DIR=(A B C D E F)
# The back-up function, if any argument is "N", processing it is omitted
bak()
{
if [[ "$*" == N ]]
then
:
else
if
[ -f $1.zip ]
then
mv -vi $1.zip BKP/$1.zip_`date +"%H-%M"`
else
echo "$(tput setaf 1) no "$1".zip$(tput sgr0)"
fi
fi
}
# The archive function, if any argument is "N", processing it is omitted. Folder
# "C" has special treatment
archive()
{
if [ $* == N ]
then
:
else
if [ $1 == C ]
then
7z a -mx=9 $1.zip ../path/$1 -r -x\!$1/nope
else
7z a -mx=9 $1.zip $1 -r -x\!$1/bogus
fi
fi
}
# case #1: no arguments
if [ -z "$*" ]
then
for i in $(seq 0 $((${#DIR[@]}-1))) # counts from 0 to array-1
do
echo "$(tput setaf 2) backup$(tput sgr0)"
bak "${DIR[i]}"
archive "${DIR[i]}"
done
exit $?
fi
# case #2: one argument, "N"
if [[ "$#" -eq 1 && "$1" == N ]]
then
for i in $(seq 0 $((${#DIR[@]}-1)))
do
echo "$(tput setaf 1) no backup needed, removing$(tput sgr0)"
rm -v "${DIR[i]}".zip
archive "${DIR[i]}"
done
exit $?
fi
# case #3: folders as arguments with "N"
if [[ "$#" -gt 1 && "$*" == *N* ]]
then
while [ "$#" -gt 1 ]
do
if [ "$1" == N ]
then
:
else
echo "$(tput setaf 1) no backup needed, removing$(tput sgr0)"
rm -v "$1".zip
fi
archive "$1"
shift
done
# case #4: folders as arguments without "N"
else
while [ "$#" -ge 1 ]
do
echo "$(tput setaf 2) backup$(tput sgr0)"
bak "$1"
archive "$1"
shift
done
fi
exit $?
关于linux - Bash 脚本 : if any argument is "N" then function has extra options,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155046/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!