我正在复制 if-then 语句,略有不同......而且我不应该这样做

我正在复制 if-then 语句,略有不同......而且我不应该这样做

我知道有更好的方法来做到这一点,我只是没有在正确的地方寻找答案。

我有一个数字这些类型的语句(例如 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 个文件。

相关内容