我对 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
。
可选:在while
and之后,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
文件的!