【发布时间】: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