Bash-Skript zum Bearbeiten des Dateinamens und Verschieben der Datei.

0

Ich habe Musik, die alle benannt ist 1 - (song author) - (song name).flac und ich möchte den Dateinamen nur ändern (song author) - (song name).flac Verschieben Sie es dann in ein Verzeichnis. Hier ist was ich bisher habe:

while IFS='' read -r line || [[ -n "$line" ]]; do
 cp $line /home/user/Desktop/Music/$(cut -c3- "$line");
done < filelist.txt

filelist.txt enthält eine Liste der Dateien, die ich umbenennen und verschieben möchte.

Es funktioniert nicht, aber in gewisser Weise fand ich es interessant. Ich bekomme den Fehler bash: /bin/cp: Argument list too longund nach Prüfung des Inhalts von line Nach dem Schnitt sieht es aus wie zufällige Zeichen / Zeichencodes. Kann mir jemand sagen, was ich falsch mache?

btf1998
quelle
Kannst du das zeigen? $line? Woher stammt die Dateiliste, vielleicht ist sie Unicode?
Paul
Außerdem befinden sich die Dateien gemäß diesem Skript im aktuellen Ordner. Nach welchen Kriterien wurden sie in die Datei "filelist.txt" aufgenommen (möglicherweise gibt es eine Möglichkeit, dies ohne die Dateiliste zu tun).
Paul
filelist.txt wurde mit erstellt ls || grep flac > filelist.txt. Ich würde lieber keine Inhalte von hinzufügen $line. Es ist genau wie der Inhalt von /dev/random
btf1998
@ btf1998 Ich fürchte, Sie haben diese Datei nicht auf diese Weise erstellt. Was Ihr Befehl sagt: "ls ausführen und nur, wenn es fehlschlägt (fast nie, so genannt), grep ausführen, das nach" flac "in stdin sucht und die Ausgabe in die Datei" filelist.txt "schreibt." Das heißt, die Datei "filelist.txt" muss erstellt worden sein, BEVOR Sie diesen Befehl auf eine andere Weise ausgeführt haben. Meine Vermutung wäre: Du hast irgendwie einen der Flacs kopiert.
Gombai Sándor
kleiner tippfehler, ls | grep flac > filelist.txt war eigentlich, wie die Datei erstellt wurde.
btf1998

Antworten:

0

cut verwendet eine Datei oder stdin, und der Schalter -c steht für Zeichen, und Sie möchten höchstwahrscheinlich stattdessen Felder mit Leerzeichen. Außerdem müssen Sie das zweite Argument von cp in Anführungszeichen setzen. Und Sie müssen -c5- angeben, um Folgendes zu entfernen:

while read -r line || [[ -n "$line" ]]; do
  cp $line "/home/user/Desktop/Music/$(echo "$line" | cut -d ' ' -f3-)"
done < filelist.txt
Ziggy Crueltyfree Zeitgeister
quelle