【问题标题】:How can I stop my script to overwrite existing files如何停止我的脚本以覆盖现有文件
【发布时间】:2021-01-11 11:59:46
【问题描述】:

我从 6 天开始就开始学习 bash,我想我已经掌握了一些基础知识。

无论如何,对于从 Variety 下载的壁纸,我已经编写了两个脚本。其中一个将下载的超过 12 天的照片移动到一个文件夹并将它们全部重命名为“Aday 1,2,3 ...”,另一个让我选择这些并将它们移动到另一个文件夹并删除我没有选择的照片.第一个脚本按我的预期工作,我的问题是关于另一个的

我想我应该写下脚本来更好地解释我的问题

脚本:

#!/bin/bash
    
    #Move victors of 'Seçme-Eleme' to 'Kazananlar'
    cd /home/eurydice/Bulunur\ Bir\ Şeyler/Dosyamsılar/Seçme-Eleme
    echo "Select victors"
    read vct
        for i in $vct; do
        mv -i "Aday $i.png" /home/eurydice/"Bulunur Bir Şeyler"/Dosyamsılar/Kazananlar/"Bahar $RANDOM.png" ;
        mv -i "Aday $i.jpg" /home/eurydice/"Bulunur Bir Şeyler"/Dosyamsılar/Kazananlar/"Bahar $RANDOM.jpg" ;
    done
    #Now let's remove the rest
    rm /home/eurydice/Bulunur\ Bir\ Şeyler/Dosyamsılar/Seçme-Eleme/*
    

在这个脚本中,我最初打算定义另一个变量(我们称之为“n”),因此我从第一个脚本中复制和更改变量也是如此。是这样的

for i in $vct; do
            n=1
            mv "Aday $i.png" /home/eurydice/"Bulunur Bir Şeyler"/Dosyamsılar/Kazananlar/"Bahar $n.png" ;
            mv "Aday $i.jpg" /home/eurydice/"Bulunur Bir Şeyler"/Dosyamsılar/Kazananlar/"Bahar $n.jpg" ;
            n=$((n+1))
        done

当我第一次这样做时,脚本按我的预期工作。但是,在我的第二次测试运行中,这个脚本覆盖了已经存在的文件。我的意思是,例如在第一次运行中,我有 5 个名称为“Bahar 1,2,3,4,5”的文件,第二次我选择了 3 个要添加的文件。我希望他们的名字是“Bahar 6,7,8”,但我的脚本将它们变成了新的 1,2 和 3。我尝试了很多解决方案,当我无法解决时,我只是为它们分配了随机数。

有没有办法让这个脚本按我的预期工作?

【问题讨论】:

  • 您需要在循环之外设置 n=1 。目前它在里面,所以每次迭代 n 都是 1..
  • 现在我把它写成read vct n=1 for i in $vct; do mv -i "Aday $i.png" /home/eurydice/"Bulunur Bir Şeyler"/Dosyamsılar/Kazananlar/"Bahar $n.png" ; mv -i "Aday $i.jpg" /home/eurydice/"Bulunur Bir Şeyler"/Dosyamsılar/Kazananlar/"Bahar $n.jpg" ; done n=$((n+1)),但这次我选择的每个文件都写成mv: overwrite '/home/eurydice/Bulunur Bir Şeyler/Dosyamsılar/Kazananlar/Bahar 1.jpg'?
  • 你需要在循环内增加n,为什么你把n=$((n+1))也在外面?
  • 哦,我对循环有点无知,所以我想如果 n 在外面,我也应该在外面增加 n :( 现在可以了!
  • 顺便说一句,对脚本中的路径进行硬编码会使它的用处大大降低。可能让它读取源目录和目标目录作为命令行参数,可能会回退到默认值。

标签: linux bash command-line


【解决方案1】:

此命令在当前目录中的文件中查找最大的文件名编号。如果没有找到文件,则将最大的数字分配给 0。

biggest_number=$(ls -1 | sed -n 's/^[^0-9]*\([0-9]\+\)\(\.[a-zA-Z]\+\)\?$/\1/p' | sort -r -g | head -n 1)

[[ ! -z "$biggest_number" ]] || biggest_number=0

sed 命令中的正则表达式假定文件名中在用于递增的尾随数字之前没有数字。

一旦找到最大的数字,就可以使用它来启动循环以防止覆盖。

n=$((biggest_number+1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多