gpt4 book ai didi

bash - 只计算成功的移动尝试

转载 作者:行者123 更新时间:2023-11-29 09:32:28 25 4
gpt4 key购买 nike

问题是我无法弄清楚如何只计算移动文件的“成功”尝试。

我的脚本将 $PATH 中的目录作为目标并尝试从指定目录中获取文件(直到目录为空),以随机顺序打乱它们并移动到 $PATH 中的目录。

x=0
while [[ $(ls -A Directory/jpg | wc -l) -gt 0 ]]
do
for i in "${destination[@]}"
do
shuf -zn1 -e Directory/jpg/*.jpg | xargs -0 mv -vt $i/somedir 2>/dev/null
x=$((x + 1))
done
done

我的“x”计数器实际上大于“Directory/jpg”中的文件数,我想“x”仅代表已复制文件的确切数量。

最佳答案

为了测试我稍微修改了脚本:

#!/bin/bash                                                                                                             
destination[0]=dest1
destination[1]=dest2
destination[2]=dest3
x=0
while [[ $(ls -A source | wc -l) -gt 0 ]]
do
for i in "${destination[@]}"
do
shuf -zn1 -e source/* | xargs -0 mv -vt $i
x=$((x + 1))
done
done

echo $x

因此在 source 中有三个目标目录和不同数量的文件,我注意到 x 始终是 destination< 元素数量的倍数 数组。

删除 2>/dev/null 揭示了一个隐藏的问题:

... # other mv output
renamed 'source/file14' -> 'dest2/file14'
renamed 'source/file16' -> 'dest3/file16'
renamed 'source/file5' -> 'dest1/file5'
mv: cannot stat 'source/*': No such file or directory
mv: cannot stat 'source/*': No such file or directory

计算最后两次失败的 Action !

for i in "${destination[@]}" 的循环次数总是等于 destination 数组中元素的数量。也就是说,如果 destination 具有三个元素,则循环将始终以 i = 1i = 2i = 3,即使没有那么多文件。 for 循环总是将 x 增加 destination 中的元素数量。因此,x 将大于移动的文件数。 (除非文件数量是目标数组中元素数量的倍数)

这可以通过在 for 循环内部添加一个测试来检查是否存在更多要移动的文件来解决:

#!/bin/bash                                                                                                             
destination[0]=dest1
destination[1]=dest2
destination[2]=dest3
x=0
while [[ $(ls -A source | wc -l) -gt 0 ]]
do
for i in "${destination[@]}"
do
shuf -zn1 -e source/* | xargs -0 mv -vt $i
x=$((x + 1))
[[ $(ls -A source | wc -l) -eq 0 ]] && break # exit the loop if there are no more files to move
done
done

关于bash - 只计算成功的移动尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com