Я очень плохо знаком с 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 в другом каталоге поэтому, когда цикл хитрости берет следующее имя от строки 2 из piku.txt для цикла, берет первый файл, который это находит в каталоге в нашем случае, это - причина файла 2, которую мы уже переместили предыдущий, один к другому каталогу.And не волнуется о mp3s bening, переименованном как 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
я присвоил полный путь теперь для для цикла, но он дает мне
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 в другом каталоге поэтому, когда цикл хитрости берет следующее имя от строки 2 из piku.txt для цикла, берет первый файл, который это находит в каталоге в нашем случае, это - причина файла 2, которую мы уже переместили предыдущий, один к другому каталогу.And не волнуется о mp3s bening, переименованном как 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
я присвоил полный путь теперь для для цикла, но он дает мне
mv: не может статистика ‘/home/shady/Desktop/music /* ’: Никакой такой файл или каталог
Эти -r
не помогает здесь, попытайтесь поместить его после read
.
Дополнительный: После while
и for
Вам или нужно ;
или новая строка, но Вам не нужны оба! Так как у Вас есть новые строки перед эти do
ключевые слова, можно удалить те два ;
с.
Кавычки должны обойти аргументы, не целую команду:
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
файлы!