Datei-Namen mit Leerzeichen in der BASH
Ich versuche, ein Skript schreiben werde, die Ernte und die Größe von großen Fotos in HD Wallpaper.
#! /bin/bash
for i in `ls *.jpg`
do
width=`identify -format '%w' $i`
height=`identify -format '%h' $i`
if [ `echo "$width/$height > 16/9" | bc -l` ]
then
exec `convert $i -resize 1920 -gravity Center -crop '1920x1080+0+0' +repage temp`
else
exec `convert $i -resize x1080 -gravity Center -crop 1920x1080+0+0 +repage temp`
fi
rm $i
mv temp $i
done
Aber es scheint, dass das script Probleme mit Dateinamen mit Leerzeichen (wie Wäschetrockner Weed.jpg). Wie kann ich dieses Problem beheben?
Die Antwort wurde bereits gegeben unten, aber ich möchte nur hinzufügen, dass shell-scripting ist wirklich schlecht für die Handhabung von Leerzeichen in Dateinamen, weil so viele Listen sind durch Leerzeichen getrennt - vor allem Argumente. Kopieren Sie eine Datei mit Leerzeichen via scp zum Beispiel! Es ist fast unmöglich, ohne manuelle entkommen.
Lesen Sie
Lesen Sie
http://mywiki.wooledge.org/BashPitfalls
in seiner Gesamtheit 🙂 es wird drastisch verbessern Sie Ihre bash-FähigkeitenInformationsquelleAutor finemann | 2010-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie brauchen nicht
ls
. Durch die Verwendungls
in backtics, du implizit bash Parsen einen string in eine Liste, die sich spaltet durch Leerzeichen. Stattdessen bash generieren der Liste aus, und trennen Sie Sie, ohne solche Macken:Außerdem müssen Sie schließen alle
$i
Verwendungen in Anführungszeichen, zu machen, bash ersetzen, es als ganzen, nicht als string-split, um Wörter zu trennen.Hier ist das Skript, das zeigt, beide Ideen:
echo
) interpretiert das Leerzeichen als Parameter-Trennzeichen.hm, das funktioniert in meiner shell mit Leerzeichen. Umschließenden
$i
in quites funktioniert der trick.Sie scheinen Recht zu sein, wenn alle Dateien im gleichen Verzeichnis, in dem dieses funktioniert auch mit Leerzeichen. Mein Skript ist fehlgeschlagen mit Leerzeichen, wenn ich
find
mit einer for-Schleife. Die Leerzeichen in den Ordner Namen stolperte mein Skript.Dies macht nicht immer was zu tun und ist daher irreführend. Dies funktioniert immer.
SAVEIFS=$IFS;IFS=$(echo -en "\n\b");for f in $(ls -lah);do echo "$f" done;IFS=$SAVEIFS
Wann würde es denn nicht funktionieren?
InformationsquelleAutor P Shved
Verwenden, Lesen Sie umgehen das problem mit Leerzeichen. Es sieht ein bisschen unnatürlich schreiben Sie die Schleife wie diese, aber es funktioniert besser:
mit
-iname
bekommst du auch die jpg-Dateien, die möglicherweise eine Erweiterung mit verschiedenen Gehäuse wie .JPG -. "i" in "iname" bedeutet ignorieren-Gehäuse.Um es zu beheben, fügen Sie eine
-print0
zufind
, und machen die shell zum Endewhile IFS= read -r -d '' i
; die-r
behebt die backslashes, die-d ''
und-print0
fix die wörtliche Zeilenumbrüche, und dieIFS=
Fehlerbehebungen-Unterstützung für name mit der Endung Leerzeichen.InformationsquelleAutor jdehaan
Ich würde empfehlen zu schreiben, die für-Zeile wie diese:
und Kapseln
$i
im Doppelzimmer-Zitate:"$i"
.Wenn Sie darauf bestehen, auf die
Stil (wenn man zum Beispiel erhalten Sie Ihre Datei-Namen aus einer komplexeren Befehl), die Sie könnten versuchen, Einstellung
IFS
zu\n
:Vergleichen Sie diese zwei Ausführungen:
InformationsquelleAutor aioobe
In der bash, die Verwendung von string-Ersetzung mit
find
:damit dies funktioniert:
InformationsquelleAutor Frank Koenen
Verwenden von doppelten Anführungszeichen um Dateinamen. Wie diese:
Bitte beachten Sie die Anführungszeichen um
"$i"
.InformationsquelleAutor Pablo Santa Cruz
InformationsquelleAutor Adam Outler
Ich vergaß den link hinzufügen, wenn Sie möchten download als txt-Datei
oder kopieren Sie einfach und fügen Sie diesen text wie nötig
ERSTEN INSTALLIEREN
DANN ERSTELLEN SIE EIN BASH-SKRIPT, DER ALLE DIESE PERSÖNLICH GESCHRIEBEN SKRIPTE.
STELLEN SIE SICHER, DASS ALLE SHELL-SKRIPT IST .sh-DATEI ENDET JEDES davon IST GESKRIPTET ZU ÖFFNEN, EIN VERZEICHNIS FÜR SIE ZU FINDEN UND HOLEN, WAS SIE WOLLEN.
ES LÄUFT EIN HINTERGRUND-TERMINAL & ERMÖGLICHT die STEUERUNG DES SONG ODER FILM.
FILM-TASTEN SIND WIE FOLGT; p oder die Leertaste für pause, q für quit, - & + für Ton rauf und runter, Pfeil Links und Pfeil rechts für überspringen vorwärts und zurück.
MUSIK-PLAYER HAT EIGENTLICH NUR EINEN SKIP-SONG UND DAS IST STRG+C, UND WENN, DASS IST DAS LETZTE LIED ODER SONG NUR DANN IST ES HERUNTERGEFAHREN, UND DAS TERMINAL GEHT WEG.
****ANWEISUNGEN, UM DIE SKRIPTS****
ÖFFNEN SIE EIN TERMINAL
CD ZU DEM VERZEICHNIS, DAS SIE WOLLEN, DASS DIE SKRIPTE WERDEN
ÖFFNEN SIE DEN NANO-EDITOR, MIT DEM TITEL SHELL SIE WOLLEN
INNEN-NANO, TYP ODER KOPIEREN/VERGANGENHEIT (DENKEN SIE DARAN, DASS IM TERMINAL MÜSSEN SIE STRG+UMSCHALT+V), DAS SCRITP
SPEICHERN SIE DIE DATEN MIT STRG+O
DRÜCKEN SIE ENTER UM ZU SPEICHERN, DASS DIE DATEI-NAMEN, ODER LÖSCHEN SIE DIE DATEI NAME GEBEN SIE DIE NEUE EIN NUR SICHERSTELLEN, DASS ES ENDET .sh und drücken Sie die EINGABETASTE
ALS NÄCHSTES MÜSSEN SIE SUDO CHMOD ES MIT +X ZU MACHEN ANKLICKBAR WIE EIN BASH
SCHLIEßLICH FÜHREN SIE ES ZU TESTEN, ENTWEDER DURCH DOPPELKLICK UND WÄHLEN SIE "AUSFÜHREN IM TERMINAL" ODER DURCH ./IM TERMINAL
SIND SIE JETZT GUT IST, WÄHLEN SIE EINEN FILM ODER WÄHLEN SIE EINEN SONG ODER EIN ALBUM AUS UND GENIEßEN SIE!
**** ALLE DIESE SKRIPTE KONTO FÜR LEERZEICHEN IN DEN DATEINAMEN
SO KÖNNEN SIE AUF "TOM PETTY" ODER "SIXTEEN STONE", OHNE DEN " _ " ZWISCHEN DEN WORTEN.
------- UHR EIN FILM-SKRIPT ------- (
-------- EIN LIED ANHÖREN -------
-------- HÖREN EINES ALBUMS ---------- TITEL IN DER REIHENFOLGE
-------- HÖREN SIE EIN ALBUM MIT SONGS IN ZUFÄLLIGER REIHENFOLGE --------
InformationsquelleAutor Alfred Gauf