脚本不起作用

脚本不起作用

我对 Linux 还很陌生,我试图从文本文件中获取 .ogg 文件的名称,并获取目录音乐的 mp3 文件并逐行重命名并将它们移动到具有该文件名称的不同目录,但没有成功。shellcheck.net显示此输出:

f 被引用但未分配

我真搞不懂。

#!/bin/bash
while -r read f;
do
for mp3 in ./music/*; 
   do
     "mv $mp3 /home/shady/Music/$f"
                  ^––SC2154 f is referenced but not assigned.
   break
   done
done < /home/shady/piku.txt

更新

*

motegi_2004.ogg
assen_2004.ogg
phakisa_2004.ogg
donington_2004.ogg
catalunya_2004.ogg
strange_symbol.ogg
credits.ogg
philip_2004.ogg
jerez_2004.ogg
brno_2004.ogg
sepang_2004.ogg
estoril_2004.ogg
motogp.ogg
frontend.ogg
valencia_2004.ogg
lemans_2004.ogg
rio_2004.ogg
mugello_2004.ogg
sachsenring_2004.ogg
thqintro.ogg
qatar_2004.ogg
training_2004.ogg
climax.ogg

*

piku.txt 包含这些名称,并且在将第一个文件作为 ogg 移动到不同目录后 for 循环中断,因此当 wile 循环从 piku.txt 第 2 行获取下一个名称时,for 循环获取它在目录中找到的第一个文件(在我们的例子中是文件 2),因为我们已经将前一个文件移动到了不同的目录。不要担心 mp3 会被重命名为 oggs,这只是一个测试。我只是想知道这是否有效

编辑:2

 1  #!/bin/bash
   2  while read -r f
   3  do
   4    for mp3 in /home/shady/Desktop/music/* 
   5    do
   6                mv -i "$mp3" "/home/shady/Music/$f"
   7                break
   8    done
   9    done < /home/shady/piku.txt
  10  

我现在为 for 循环分配了完整路径,但它给了我

mv:无法统计‘/home/shady/Desktop/music/*’:没有该文件或目录


*

motegi_2004.ogg
assen_2004.ogg
phakisa_2004.ogg
donington_2004.ogg
catalunya_2004.ogg
strange_symbol.ogg
credits.ogg
philip_2004.ogg
jerez_2004.ogg
brno_2004.ogg
sepang_2004.ogg
estoril_2004.ogg
motogp.ogg
frontend.ogg
valencia_2004.ogg
lemans_2004.ogg
rio_2004.ogg
mugello_2004.ogg
sachsenring_2004.ogg
thqintro.ogg
qatar_2004.ogg
training_2004.ogg
climax.ogg

*

piku.txt 包含这些名称,并且在将第一个文件作为 ogg 移动到不同目录后 for 循环中断,因此当 wile 循环从 piku.txt 第 2 行获取下一个名称时,for 循环获取它在目录中找到的第一个文件(在我们的例子中是文件 2),因为我们已经将前一个文件移动到了不同的目录。不要担心 mp3 会被重命名为 oggs,这只是一个测试。我只是想知道这是否有效

编辑:2

 1  #!/bin/bash
   2  while read -r f
   3  do
   4    for mp3 in /home/shady/Desktop/music/* 
   5    do
   6                mv -i "$mp3" "/home/shady/Music/$f"
   7                break
   8    done
   9    done < /home/shady/piku.txt
  10  

我现在为 for 循环分配了完整路径,但它给了我

mv:无法统计‘/home/shady/Desktop/music/*’:没有该文件或目录

答案1

这里-r没有帮助,请尝试将其放置read

可选:在whileand之后,for您需要;或换行符,但不需要两者!由于do关键字之前有换行符,因此您可以删除这两个;s。

引号应该围绕参数,而不是整个命令:

    mv -i "$mp3" "/home/shady/Music/$f"

我添加了-i,这样mv就不会尝试覆盖任何现有文件。

至关重要的是,循环内又循环。您不能多次移动一个 mp3 文件!如果您想将两组文件名混合在一起,您可以尝试使用paste从每个文件中提取行并将它们组合起来:

paste <(find ./music/* -maxdepth 1 -printf '"%p"\n') /home/shady/piku.txt | sed 's+^+mv -i +' > /tmp/move_my_files.sh

然后您可以查看生成的文件并查看它是否满足您的要求。

(如果 piku.txt 中的所有文件名包含空格,则可能需要用引号引起来。)

如果您对脚本的外观满意move_my_files.sh,则可以运行它:

bash -e -x /tmp/move_my_files.sh

如果我误解了你的意图,你可能需要解释得更清楚,包括piku.txt的内容和预期的结果,以及mp3文件是如何变成ogg文件的!

相关内容