Ich bin noch sehr neu im Shell-Scripting, daher bin ich mir sicher, dass dieser Befehl in vielerlei Hinsicht falsch ist. Ich versuche, einen Ordner mit Dateien in die Namen einer txt-Datei umzubenennen. Voraussetzung ist, dass die Dateinamen.txt und die Dateien im Ordner bereits so organisiert sind, dass die erste Zeile mit der ersten Datei im System übereinstimmt. Was ich bekam, war:
while read line; do echo -e "$line\n" | for f in *mkv do mv f $1; done < filenames.txt
aber es hat nicht funktioniert. Könnt ihr mir helfen, das Problem zu beheben?
Danke
Antwort1
Wenn Sie keine algorithmische Regel zum Umbenennen der Dateien haben (d. h. Sie benötigen tatsächlich eine Datei als Eingabe), würde ich vorschlagen,
Erstellen Sie eine TXT-Datei aus der Liste der Dateien, die Sie umbenennen möchten, zB:
finde . -name "*.mkv" > dateien.txt
editieren Sie diese Datei und fügen Sie in jeder Zeile den neuen Namen nach dem alten ein, zB
./meinererster.mkv ./meinneuererster.mkv
Verarbeite diese Datei:
während Zeile lesen; eval mv $line durchführen; fertig < files.txt
Antwort2
Ich lasse mich hiervon inspirieren:https://unix.stackexchange.com/a/26604
Es klingt, als müssten Sie sowohl die Datei als auch die Dateien im Verzeichnis gleichzeitig durchlaufen:
DIR=./thefiledir
while : ; do
read -r oldfile <&3
read -r newfile <&4
if [ -z "$oldfile" -o -z "$newfile" ]; then
break
fi
mv $oldfile $newfile
done 3< <( find $DIR -maxdepth 1 -type f | sort ) 4< filenames.txt
Ich weiß nicht, ob Sie den Verzeichnisnamen in der Datei haben , daher möchten Sie möglicherweise vor der Zeile filenames.txt
eins einfügen, um zu testen, ob dies das gewünschte Ergebnis bringt.echo
mv
Ich könnte es auch anders versuchen ... Ich bin nicht sicher, wie Sie die Datei mit den neuen Namen generieren, aber wie in einer anderen Antwort vorgeschlagen wird, könnten Sie eine Schleife über eine Datei mit alten und neuen Namen ausführen oder einfach die Namen lesen und eine Logik anwenden, um die neuen Namen zu erstellen.