Ich versuche, ein Shell-Skript zu schreiben, das eine bestimmte Datei findet und in einen Ordner verschiebt.
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read text2
while :
do
echo -n "Ara:"
read text1
b=$(find /home/cosmoretro 2>/dev/null -iname "$text1"*)
IFS=$'\n'
mv $b /home/cosmoretro/movie/"$text2"
done
Es werden aber auch Dateien verschoben, wenn die Datei dem durchsuchten Ordner entspricht.
Ich möchte nur den Ordner verschieben.
Antwort1
Ich habe schon beim Lesen dieses Skripts Schwierigkeiten. Darf ich vorschlagen, dass Sie es ein wenig umschreiben?
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read destinationFileName
while :
do
echo -n "Ara:"
read sourceFileName
sourceFile=$(find /home/cosmoretro -type d -iname "$sourceFileName" -print -quit 2> /dev/null)
if [[ -z $sourceFile ]]; then
echo "No file named $sourceFileName found"
else
mv -- "$sourceFile" /home/cosmoretro/movie/"$destinationFileName"
fi
done
Was ich getan habe:
- Verwenden Sie beschreibende Namen wie
destinationFileName
anstelle vontext2
- Richtig einrücken
- Geben Sie an,
find
dass nur Verzeichnisse gefunden werden sollen-type d
. Wenn Sie nur Dateien verschieben möchten, verwenden Sie-type f
anstelle von-type d
. - Verschieben Sie die Umleitung an das Ende eines Befehls, da sie nicht wichtig ist
- Stoppen
find
, nachdem die erste Datei gefunden wurde (-quit
) - Entfernen Sie das Überflüssige
*
imfind
Befehl – ich bin mir nicht sicher, was Sie damit bezwecken. Wenn Sie für Dateinamen Platzhalter verwenden wollten (z. B.foo
würde die Suche nachfoobar
) zurückgeben, müssen Sie den Platzhalter einfügenhineindie Anführungszeichen, dh"$sourceFileName*"
. - Überprüfen Sie, ob überhaupt eine Datei gefunden wurde, indem
-z
Sie testen, ob das Ergebnis leer ist. - Schützen Sie sich
mv
vor Dateinamen, die mit beginnen,-
indem Sie die Option „Ende der Optionen“ verwenden.--
- Setzen Sie Argumente richtig in Anführungszeichen, um zu verhindern, dass Leerzeichen den Befehl unterbrechen (keine Änderung nötig
IFS
)