Probleme mit cp und rename im shell script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Quirrlila
Beiträge: 74
Registriert: 12.08.2017 21:59:59
Lizenz eigener Beiträge: GNU General Public License

Probleme mit cp und rename im shell script

Beitrag von Quirrlila » 06.07.2018 00:56:33

Ich will flac-Dateien in einem Verzeichnis in ein anderes Format umwandeln.
Dann sollen in einem anderen Verzeichnis diese umgewandelten Dateien landen, wiederum in einem Verzeichnis dass den selben Namen hat wie das Verzeichnis aus denen die input-Dateien stammen.

Mein script heißt ConvertAndCopy.user:

Code: Alles auswählen

#!/bin/sh

for f in "$1"*"$2"; do ffmpeg -n -loglevel error -loglevel warning -i "$f" -acodec "$3" "${f%.flv}."$4""; done &&
cd "$5" && # change to another path
mkdir -p "$1" && # create directory with parents and the same name in that path
cp "$1"*"$4" "$5" && # copy the converted files into the new directory
rename 's/"$2"//g' *."$4" && #remove the old file ending
echo "" &&
pwd && # checking correct converting and copying
ls -1

# Explanation:
# "$1" input path
# "$2" input .FILEENDING
# "$3" audiocodec
# "$4" output .FILEENDING
# "$5" target directory where to create copies of the original directories and move the output files to
Wechsel in ein Testverzeichnis mit zwei Unterverzeichnissen, in einem befindet sich eine flac-Datei:

Code: Alles auswählen

ls -R1
.:
1
2

./1:
TEST.flac

./2:
Aufruf des scriptes mit den gewünschten Variablen:

Code: Alles auswählen

ConvertAndCopy.user 1/ .flac libmp3lame mp3 2/
cp: cannot stat '1/*mp3': No such file or directory

Code: Alles auswählen

ls -R1
.:
1
2

./1:
TEST.flac
TEST.flac.mp3

./2:
1

./2/1:
Mit mv anstatt cp ist es das gleiche...

rename gibt wenn ich es mit Variablen in scripts nutze folgendes aus:

Code: Alles auswählen

Use of uninitialized value VARIABLE in regexp compilation at (eval 5) line ZEILE.
=-/

Benutzeravatar
hikaru
Beiträge: 9995
Registriert: 09.04.2008 12:48:59

Re: Probleme mit cp und rename im shell script

Beitrag von hikaru » 06.07.2018 07:09:52

Quirrlila hat geschrieben: ↑ zum Beitrag ↑
06.07.2018 00:56:33
Aufruf des scriptes mit den gewünschten Variablen:

Code: Alles auswählen

ConvertAndCopy.user 1/ .flac libmp3lame mp3 2/
cp: cannot stat '1/*mp3': No such file or directory
Du verwendest also relative Pfade. Daraus ergibt sich für dein Script folgendes Problem:
Quirrlila hat geschrieben: ↑ zum Beitrag ↑
06.07.2018 00:56:33

Code: Alles auswählen

cd "$5" && # change to another path
mkdir -p "$1" && # create directory with parents and the same name in that path
cp "$1"*"$4" "$5" && # copy the converted files into the new directory
Weil du hier in Zeile 1 schon den Pfad wechselst, ändert sich in Zeile 3 auch das Quellverzeichnis $1 für deinen cp-Aufruf. Das hast du zwar in Zeile 2 angelegt, aber es ist natürlich noch leer, weil es ja eigentlich dein Zielverzeichnis $5 ist.

Absolute Pfade bringen dich mit dem Script in der Form übrigens nicht weiter, denn dann hast du das Problem, dass dein mkdir-Aufruf nicht im Zielverzeichnis arbeitet.

Benutzeravatar
Meillo
Moderator
Beiträge: 5091
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Probleme mit cp und rename im shell script

Beitrag von Meillo » 06.07.2018 09:01:08

Quirrlila hat geschrieben: ↑ zum Beitrag ↑
06.07.2018 00:56:33
Ich will flac-Dateien in einem Verzeichnis in ein anderes Format umwandeln.
Dann sollen in einem anderen Verzeichnis diese umgewandelten Dateien landen, wiederum in einem Verzeichnis dass den selben Namen hat wie das Verzeichnis aus denen die input-Dateien stammen.

Mein script heißt ConvertAndCopy.user:

Code: Alles auswählen

#!/bin/sh

for f in "$1"*"$2"; do ffmpeg -n -loglevel error -loglevel warning -i "$f" -acodec "$3" "${f%.flv}."$4""; done &&
cd "$5" && # change to another path
mkdir -p "$1" && # create directory with parents and the same name in that path
cp "$1"*"$4" "$5" && # copy the converted files into the new directory
rename 's/"$2"//g' *."$4" && #remove the old file ending
echo "" &&
pwd && # checking correct converting and copying
ls -1

# Explanation:
# "$1" input path
# "$2" input .FILEENDING
# "$3" audiocodec
# "$4" output .FILEENDING
# "$5" target directory where to create copies of the original directories and move the output files to
Hier mal mein Versuch, dein Script nach meinem Stil umzubauen. Hab's nicht getestet. Entweder es funktioniert einfach oder es ist ein Ansatzpunkt fuer weitere Arbeit.

Die Idee ist, die Zieldateien gleich dort abzulegen wo sie hin sollen. Beim Zielpfad ist "$dest/$src" die entscheidende Idee. Das funktioniert mit relativen und absoluten Pfaden. Ich wechsele nie das Arbeitsverzeichnis.

`set -e' erscheint mir besser zu sein als diese ganzen `&&' (die ja doch nicht an allen Stellen vorhanden waren).

Code: Alles auswählen

#!/bin/sh

set -e  # exit on error

src="$1"	# input path
iext="$2"	# input .FILEENDING
acodec="$3"	# audiocodec
oext="$4"	# output .FILEENDING
dest="$5"	# target directory where to create copies of the original directories and move the output files to

mkdir -p "$dest/$src"
for f in "$src"/*."$iext"; do
	ffmpeg -n -loglevel error -loglevel warning -i "$f" -acodec "$acodec" "$dest/${f%.$iext}.$oext"
done
Use ed(1) once in a while!

Antworten