![我正在复制 if-then 语句,略有不同......而且我不应该这样做](https://linux22.com/image/60545/%E6%88%91%E6%AD%A3%E5%9C%A8%E5%A4%8D%E5%88%B6%20if-then%20%E8%AF%AD%E5%8F%A5%EF%BC%8C%E7%95%A5%E6%9C%89%E4%B8%8D%E5%90%8C......%E8%80%8C%E4%B8%94%E6%88%91%E4%B8%8D%E5%BA%94%E8%AF%A5%E8%BF%99%E6%A0%B7%E5%81%9A.png)
我知道有更好的方法来做到这一点,我只是没有在正确的地方寻找答案。
我有一个数字这些类型的语句(例如 1-100,或不同文件名的列表)。基本上,我对所有这些进行检查,然后对它们执行相同类型的命令。
如果 [ -f ~/file1 ];然后 如果 [ -f ~/Backup/file1 ];然后 rm ~/file1; # 有一天,也许还会进行文件大小或文件日期检查(调查 eval) 别的 cp -ip ~/file1 ~/备份/file1; rm ~/file1; 菲 菲
应该有某种方法使它成为一个函数(用 file1 循环一次,然后用 file2 再次循环,等等),而不必一遍又一遍地复制和粘贴这些东西。
我想要一些对新手来说很清楚的东西,因为一旦我开始工作,我可能 5 年内都不会再看它,当我回到它时,我可能会忘记所有的东西不太清楚。这样做的好处是可以清楚地了解正在发生的事情:P
我读过一些执行此操作的代码,说:“嗯,这很有趣,当我需要执行超过 3-4 个 if-then 时,我应该使用它。”然后就直接没写了..
其中一些文件是:filename001、filename002、...filename100。
对于专门命名的文件,我也有同样的问题,在这种情况下,我真的很想遍历文件名列表,然后将新文件名添加到列表中(而不是复制粘贴代码)。
我不想通过命令行输入任何内容,所有内容都将在脚本中列出(这样我就可以测试它,这样我就不能搞砸或打错一些我不想输入的内容)。数据文件将脚本调用的每个文件名逐行列出的想法对我来说很有趣 - 但我不确定如何实现这一点。有链接吗?
因为这可以是一个很多更容易 - 也更高效。
我知道可以,但也必须让那些不会编程的人(即我,在 5 年后)清楚地知道,当我从一个我真的不知道如何编程的地方开始,并且将会有当它滚动时忘记了很多事情(如果它没有移交给其他人))。我基本上会接受我能理解的东西并不断地研究它们,直到我可以滥用它们来达到我的目的。现在,我的脚本不需要非常高效,因为计算机对于我正在做的事情类型来说已经足够快了。
如果备份文件存在,那么我就删除当前文件(如果它存在 - 如果不存在,我希望脚本继续执行下一个可能性)。如果备份不存在,我正在复制当前文件(希望如果我运行超过配额或其他东西(其他东西可能在复制期间产生/吸收配额),它只会出现错误,并且不会删除任何内容不可恢复)然后删除当前文件。
我不介意添加一些东西来测试备份文件是否有用:时间戳(哪一个更新?)、大小(哪一个更大?)、哈希(文件复制是否完全正确?) - 但是现在没有必要。
答案1
好吧,我想你正在寻找一个循环。
cd ~; i=1000; set --
until [ "$((i+=1))" -gt 1100 ]
do _i=${i#1}
if [ -f ./file"$_i" ] &&
[ -f ./Backup/file"$_i" ]
then rm ./file"$_i"
else set -- ./file"$_i" "$@"
fi
done
[ "$#" -gt 0 ] &&
cp -ip "$@" ./Backup &&
rm "$@"
这将计数到 100 并处理file[001-100]
.它构建了一个需要复制的文件数组,并cp -ip
根据需要立即、循环关闭。rm
事实上,如果您选择使用命名数组而不是 shell 数组,您也可以执行相同的操作。
迭代器用零填充最多 100(初步-gt
评估将其切断),但是,正如所写,可以相当容易地修改脚本以处理最多 999 个文件。