Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Der Code-Schnippsel-Thread
mrshadowtux Offline
borsenrap

Beiträge: 558
Registriert seit: Jul 2019
Beitrag #801
RE: Der Code-Schnippsel-Thread
Naja, wo außer bei function()-Blöcken ntuzt Bash die schon normalerweise für Anfang und Ende von Blöcken?
(Dieser Beitrag wurde zuletzt bearbeitet: 14.06.2021 21:48 von mrshadowtux.)
14.06.2021 21:48
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
s4ndwichMakeR Offline
Realitätsfeinmotoriker‮

Beiträge: 5.195
Registriert seit: Jul 2008
Beitrag #802
RE: Der Code-Schnippsel-Thread
(14.06.2021 19:11)amok_alex schrieb:  Ebenso sollte man bei Bash-Scripten immer beachten, dass Schleifen mit dem Keyword 'do' eröffnet und mit 'done' abgeschlossen werden. Jedes mal vergess ich das nämlich, weil von anderen C-like-Sprachen gewohnt, die geschweiften Klammern den Beginn und das Ende des jeweiligen Blocks definieren. Nur haben die bei der Bash halt ne andere Funktion als den Beginn und Abschluss eines Anweisungsblocks zu kennzeichnen.

Das ist kein spezifisches Bash-Feature, sondern schon von der Bourne Shell geerbt. Stephen Bourne hatte nicht etwa C als Inspiration für die Strukturen, sondern ALGOL, wo eben mit Keywords statt mit Klammern gearbeitet wird. Auf den Maschinen der Zeit – da war ja selbst ASCII noch relativ neu – konnte man sich nicht darauf verlassen, dass man überhaupt eine große Auswahl an Klammern im Zeichensatz zur Verfügung hatte. Offenbar konnte man sich lediglich auf ( und ) verlassen, denn immerhin definiert ALGOL sogar Keywords für < und > als Vergleichsoperatoren (lt bzw. gt). Frühe Programmiersprachen waren stark naturalistisch mit echten Wörtern statt Zeichen, weil [A-Z] und rudimentäre Interpunktion und mathematische Symbole der kleinste gemeinsame Nenner der Zeichensätze war – außer vielleicht beim APL-Zeichensatz, der als Gegenteil hier deutlich hervorsticht. C setzte dann schon implizit auf ASCII-unterstützende Maschinen, auch wenn in The C Programming Language afair noch EBCDIC an einigen Stellen erwähnt wird (müsste bei mathematischen Operation auf char-Variablen wie z.B. für Case-Umwandlung der Fall sein).

• • • – • – – • – –
16.06.2021 07:48
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
tk1908 Offline
Unixer

Beiträge: 7.354
Registriert seit: Apr 2009
Beitrag #803
RE: Der Code-Schnippsel-Thread
Backup-Script
Code:
#!/bin/bash

echo "############################################"
echo "############################################"
echo "# Backup-Script                            #"
echo "# Author: tk1908                           #"
echo "# E-Mail: tk1908@tkbrew.net                #"
echo "#                                          #"
echo "############################################"
echo "############################################"

OS=$(uname)

echo OS=$(uname)


# ROOTPATH für Darwin vorerst im HOME, hier muss noch debuggt werden. Ordner-Erstellung unter Volumes schlägt scheinbar fehl.

case $OS in

  Linux)  
        ROOTPATH="/mnt"
        ;;


  Darwin)  
        ROOTPATH="${HOME}/Test"
        ;;
esac

echo Funktionsaufruf

HOSTS=(krypton keppler tesla)
SHARES=( $(showmount -e keppler | awk '{print $1}' | sed '1d' | sed 's/^\(\/.*\)\/\(.*\)$/\2/') )

# Shareliste wird von keppler abgerufen. So ist sichergestellt, dass alle Shares erfasst werden.





for HOST in "${HOSTS[@]}"; do sudo mkdir $ROOTPATH/$HOST; for SHARE in "${SHARES[@]}";do sudo mkdir $ROOTPATH/$HOST/$SHARE;  done; done

#tier2_Backup

function tier3_Backup () {
echo "Migrate Data from keppler to tesla"
echo "Creating Directorystructure an mounting shares"
for SHARE in "${SHARES[@]}"; do sudo mount ${HOSTS[2]}:/mnt/${HOSTS[2]}/$SHARE $ROOTPATH/${HOSTS[2]}/$SHARE; done
for SHARE in "${SHARES[@]}"; do sudo mount ${HOSTS[3]}:/mnt/xenon01/$SHARE $ROOTPATH/${HOSTS[3]}/$SHARE; done # Vorsicht Array in tesla heißt immernoch xenon01. Muss noch geändert werden!
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/applications/ $ROOTPATH/${HOSTS[3]}/applications
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/documents/ $ROOTPATH/${HOSTS[3]}/documents
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/games/ $ROOTPATH/${HOSTS[3]}/games
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/hoerspiele/ $ROOTPATH/${HOSTS[3]}/hoerspiele
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/misc/ $ROOTPATH/${HOSTS[3]}/misc
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/music/ $ROOTPATH/${HOSTS[3]}/music
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/archive/porn/ $ROOTPATH/${HOSTS[3]}/porn
rsync -rvu --exclude '#recycle' $ROOTPATH/${HOSTS[2]}/videos/ $ROOTPATH/${HOSTS[3]}/videos
sudo umount /mnt/${HOSTS[2]}/*
sudo umount /mnt/${HOSTS[3]}/*
}

tier3_Backup

echo cleaning

sudo umount $SOURCEMOUNTPATH
sudo umount $TARGETMOUNTPATH
sudo rm -rf /mnt/*

Ausgabe
Code:
❯ /home/tkoehler/Git/Projekte/Home/Scripts/Unix-Shell/Backup
############################################
############################################
# Backup-Script                            #
# Author: tk1908                           #
# E-Mail: tk1908@tkbrew.net                #
#                                          #
############################################
############################################
OS=Linux
Funktionsaufruf
mkdir: cannot create directory ‘/mnt/krypton’: File exists
mkdir: cannot create directory ‘/mnt/krypton/wsusoffline’: File exists
mkdir: cannot create directory ‘/mnt/krypton/videos’: File exists
mkdir: cannot create directory ‘/mnt/krypton/music’: File exists
mkdir: cannot create directory ‘/mnt/krypton/hoerspiele’: File exists
mkdir: cannot create directory ‘/mnt/krypton/games’: File exists
mkdir: cannot create directory ‘/mnt/krypton/backups’: File exists
mkdir: cannot create directory ‘/mnt/krypton/archive’: File exists
mkdir: cannot create directory ‘/mnt/krypton/pictures’: File exists
mkdir: cannot create directory ‘/mnt/krypton/misc’: File exists
mkdir: cannot create directory ‘/mnt/krypton/documents’: File exists
mkdir: cannot create directory ‘/mnt/krypton/applications’: File exists
mkdir: cannot create directory ‘/mnt/keppler’: File exists
mkdir: cannot create directory ‘/mnt/keppler/wsusoffline’: File exists
mkdir: cannot create directory ‘/mnt/keppler/videos’: File exists
mkdir: cannot create directory ‘/mnt/keppler/music’: File exists
mkdir: cannot create directory ‘/mnt/keppler/hoerspiele’: File exists
mkdir: cannot create directory ‘/mnt/keppler/games’: File exists
mkdir: cannot create directory ‘/mnt/keppler/backups’: File exists
mkdir: cannot create directory ‘/mnt/keppler/archive’: File exists
mkdir: cannot create directory ‘/mnt/keppler/pictures’: File exists
mkdir: cannot create directory ‘/mnt/keppler/misc’: File exists
mkdir: cannot create directory ‘/mnt/keppler/documents’: File exists
mkdir: cannot create directory ‘/mnt/keppler/applications’: File exists
mkdir: cannot create directory ‘/mnt/tesla’: File exists
mkdir: cannot create directory ‘/mnt/tesla/wsusoffline’: File exists
mkdir: cannot create directory ‘/mnt/tesla/videos’: File exists
mkdir: cannot create directory ‘/mnt/tesla/music’: File exists
mkdir: cannot create directory ‘/mnt/tesla/hoerspiele’: File exists
mkdir: cannot create directory ‘/mnt/tesla/games’: File exists
mkdir: cannot create directory ‘/mnt/tesla/backups’: File exists
mkdir: cannot create directory ‘/mnt/tesla/archive’: File exists
mkdir: cannot create directory ‘/mnt/tesla/pictures’: File exists
mkdir: cannot create directory ‘/mnt/tesla/misc’: File exists
mkdir: cannot create directory ‘/mnt/tesla/documents’: File exists
mkdir: cannot create directory ‘/mnt/tesla/applications’: File exists
Migrate Data from keppler to tesla
Creating Directorystructure an mounting shares
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: Protocol not supported
mount.nfs: mount point /mnt//wsusoffline does not exist
mount.nfs: mount point /mnt//videos does not exist
mount.nfs: mount point /mnt//music does not exist
mount.nfs: mount point /mnt//hoerspiele does not exist
mount.nfs: mount point /mnt//games does not exist
mount.nfs: mount point /mnt//backups does not exist
mount.nfs: mount point /mnt//archive does not exist
mount.nfs: mount point /mnt//pictures does not exist
mount.nfs: mount point /mnt//misc does not exist
mount.nfs: mount point /mnt//documents does not exist
mount.nfs: mount point /mnt//applications does not exist
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/applications" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/documents" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/games" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/hoerspiele" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/misc" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/music" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [sender] change_dir "/mnt/tesla/archive/porn" failed: No such file or directory (2)

sent 19 bytes  received 12 bytes  62.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
sending incremental file list
rsync: [generator] recv_generator: mkdir "/mnt/videos" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
./

sent 42 bytes  received 19 bytes  122.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1330) [sender=v3.2.3]
umount: /mnt/tesla/applications: not mounted.
umount: /mnt/tesla/archive: not mounted.
umount: /mnt/tesla/backups: not mounted.
umount: /mnt/tesla/documents: not mounted.
umount: /mnt/tesla/games: not mounted.
umount: /mnt/tesla/hoerspiele: not mounted.
umount: /mnt/tesla/misc: not mounted.
umount: /mnt/tesla/music: not mounted.
umount: /mnt/tesla/pictures: not mounted.
umount: /mnt/tesla/videos: not mounted.
umount: /mnt/tesla/wsusoffline: not mounted.
umount: /mnt//keppler: not mounted.
umount: /mnt//krypton: not mounted.
umount: /mnt//tesla: not mounted.
cleaning
umount: bad usage
Try 'umount --help' for more information.
umount: bad usage
Try 'umount --help' for more information.
    /mnt 

Irgendjemand ne Idee, was hier falsch läuft? Wenn ich die function tier3_Backup definiere und dann ausführe, dann tut alles.

[Bild: Rz3JNLI.gif]
Meine Beiträge stehen unter der MIT-Lizenz:D

(09.04.2016 13:26)tk1908 schrieb:  externe HDD am Router? Klar ich tausch mein Auto gegen nen Tretroller mit Bremsklotz.
(Dieser Beitrag wurde zuletzt bearbeitet: 19.08.2021 11:11 von tk1908.)
19.08.2021 11:10
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Benjamin92 Offline
tauscht CMOS-Batterie per TeamViewer

Beiträge: 7.791
Registriert seit: Jul 2008
Beitrag #804
RE: Der Code-Schnippsel-Thread
Folgender Code gibt bei Windows 10 und Windows 11 exakt das selbe aus:
Code:
#include <windows.h>
#include <stdio.h>

int main()
{
    DWORD dwVersion = 0;
    DWORD dwMajorVersion = 0;
    DWORD dwMinorVersion = 0;
    DWORD dwBuild = 0;

    dwVersion = GetVersion();

    // Get the Windows version.

    dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
    dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));

    // Get the build number.

    if (dwVersion < 0x80000000)
        dwBuild = (DWORD)(HIWORD(dwVersion));

    printf("Version is %d.%d (%d)\n",
                dwMajorVersion,
                dwMinorVersion,
                dwBuild);
}
16.01.2022 15:38
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
TAL Offline
機関車

Beiträge: 6.348
Registriert seit: Jul 2008
Beitrag #805
RE: Der Code-Schnippsel-Thread
FYI zum letzten Post:
Ist ja schliesslich auch seit Vorkriegszeiten so dokumentiert: https://docs.microsoft.com/en-us/windows...getversion

Füge ein entsprechendes Manifest hinzu und die Funktion wird die Version des entsprechenden Manifestes zurückgeben.

16.01.2022 15:41
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.221
Registriert seit: Jul 2008
Beitrag #806
RE: Der Code-Schnippsel-Thread
Ein Beispiel für den Umgang für read mit einer Pipeline:
Code:
#!/bin/bash
set -euo pipefail
shopt -s lastpipe

if [[ $# -lt 2 ]]; then
        echo "usage: $0 java_home weblogic_domain_dir"
        exit 1
fi
JAVA=$1/bin/java
DOMAIN_DIR=$2

if [[ ! -d $DOMAIN_DIR/bin ]]; then
        echo "Wrong domain directory"
        exit 1
fi
if [[ ! -x $JAVA ]]; then
        echo "No Java detected"
        exit 1
fi
"$JAVA" -version 2>&1 | head -n 1 | read -r jenv jverstr jversion
if [[ $jenv != java ]] || [[ ! $jversion =~ ^\"1.8.0_([0-9]+)\"$ ]]; then
        echo "Java version not detected as Oracle JDK 8"
        exit 1
fi

jupdate=${BASH_REMATCH[1]}
echo Java 8 update: $jupdate
if [[ $jupdate -ge 330 ]]; then
        echo "Appending setUserOverrides.sh..."
        cat << 'EOF' >> "$DOMAIN_DIR/bin/setUserOverrides.sh"

JAVA_OPTIONS="${JAVA_OPTIONS} -Dcom.sun.jndi.ldapURLParsing=legacy"
export JAVA_OPTIONS
EOF
else
        echo "Nothing to do."
fi

Standardmäßig führt Bash jedes Element einer Pipeline in seiner eigenen Subshell aus, was beim Idiom
Code:
Befehl | while read var1 var2 var3; do ...; done
nicht weiter auffällt und sogar oft wünschenswert ist, dass der äußere Geltungsbereich nicht mit $var1, $var2, $var3 verschmutzt wird.
Mit der Shell-Option lastpipe kann man seit Bash 4.2 in einem Shell-Skript (oder einer interaktiven Shell mit deaktiviertem Job Control) das letzte Element einer Pipeline ohne Subshell ausführen, sodass zum Beispiel wie hier Variablen nicht-flüchtig gesetzt werden können. Dieses Verhalten ist ansonsten nur in der originalen Korn-Shell (ksh93) zu finden, aber genauso wenig in pdksh/mksh.
ZSH und ältere Bash-Versionen müssen auf Prozessersetzung zurückgreifen, in anderen Shells geht dies nur mit einer temporären Datei:
Code:
read -r jenv jverstr jversion < <("$JAVA" -version 2>&1 | head -n 1)

Erinnerst du dich an #whfclassics? Es ist zurück! In Pog-Form.
(Dieser Beitrag wurde zuletzt bearbeitet: 27.09.2022 14:50 von DosAmp.)
27.09.2022 14:48
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
tk1908 Offline
Unixer

Beiträge: 7.354
Registriert seit: Apr 2009
Beitrag #807
RE: Der Code-Schnippsel-Thread
Ich werf hier mal wider was rein:

Code:
#!/bin/bash

echo "############################################"
echo "############################################"
echo "# Downloadmover                            #"
echo "# Author: tk1908                           #"
echo "# E-Mail: tk1908@tkbrew.net                #"
echo "# Version 0.6                              #"
echo "############################################"
echo "############################################"


OS=$(uname)
#DOWNLOADPATH=/mnt/apex01/downloads/Incomming

echo OS=$OS

case $OS in
  
  Linux)
  DOWNLOADPATH=/mnt/apex01/downloads
  ;;

  Darwin)
  DOWNLOADPATH=/Volumes/downloads
  ;;
esac
DATE=$(date +%F)
ARCPATH=$DOWNLOADPATH/archive/$DATE
LOGPATH=$DOWNLOADPATH/logs/$DATE.txt

if [ ! -f "$ARCPATH" ]; then

    mkdir -p $ARCPATH

fi

if [ ! -f "$LOGPATH" ]; then

    touch $LOGPATH

fi

echo "Finding Documents (docs and pdfs)" >> $LOGPATH
find $DOWNLOADPATH/Incomming -type f \( -iname \*."pdf" -o -iname \*."doc" \) -execdir mv -v {} $DOWNLOADPATH/Output/docs \; >> $LOGPATH

echo "Finding ISOs (mostly Games)" >> $LOGPATH
find $DOWNLOADPATH/Incomming -type f \( -iname \*."iso" \) -execdir mv -v {} $DOWNLOADPATH/Output/Games \; >> $LOGPATH

echo Finding SD-Clips >> $LOGPATH
find $DOWNLOADPATH/Incomming -type f \( -iname \*."mp4" -o -iname \*."flv" -o -iname \*."wmv" \) -not -iname "*720p*" -not -iname "*1080p*" -not -iname "*2160p*" -exec mv -v {} $DOWNLOADPATH/Output/SD \; >> $LOGPATH

echo Finding 720p Paysite Clips >> $LOGPATH
find $DOWNLOADPATH/Incomming -type f \( -iname \*\720p\*.mp4 \) -exec mv -v {} $DOWNLOADPATH/Output/Porn/720p/ \; >> $LOGPATH

echo Finding 1080p Paysite Clips >> $LOGPATH
find $DOWNLOADPATH/Incomming -type f \( -iname \*\1080p\*.mp4 \) -exec mv -v {} $DOWNLOADPATH/Output/Rename/ \; >> $LOGPATH

echo Finding 2160p Paysite Clips >> $LOGPATH
find $DOWNLOADPATH/Incomming -type f \( -iname \*\2160p\*.mp4 \) -exec mv -v {} $DOWNLOADPATH/Output/encode \; >> $LOGPATH

cat $LOGPATH

# Processing Video-Files

echo Rename 1080p-Content
cd $DOWNLOADPATH/Output/Rename
for f in *.mp4; do ffmpeg -i "$f" -c:v copy -c:a copy -metadata title= "output/${f%.*}.MP4-WRB.mp4"; done
for i in $DOWNLOADPATH/Output/Rename/output; do site=${i%%.*.mp4}; if [ ! -d "/mnt/apex01/path/"$artist""]; then echo "Folder $artist for File $i not in Registry"; else mv -v $i /mnt/apex01/porn/Paysite Scenes/"$site"
echo "The Following Files are left over"
ls $DOWNLOADPATH/porn/Rename/output

echo Clearing Sourcefiles
rm $DOWNLOADPATH/Output/Porn/Rename/*.mp4

echo Processing 4k-Content
cd $DOWNLOADPATH/Output/Porn/encode
for f in *.mp4; do ffmpeg -i "$f" -c:a copy -map 0 -crf 20 -preset slow "output/${f%.*}.MP4-WRB.mp4"; done
prename 's/2160p/1080p/' ./output/*.mp4

echo "Clearing Sourcefiles (4k)"
rm -v $DOWNLOADPATH/Output/Porn/encode/*.mp4

# List Things older than 7 Days
echo "Die folgenden Dateien sind älter als 7 Tage und werden nach weiteren 7 Tagen ins Archiv verschoben"
find $DOWNLOADPATH/output -mtime +7
echo "Die Dateien werden am $(date +%F -d "+7 days") ins Archiv verschoben" >> $LOGPATH


# Move things older than 14 Days to archive
echo "Follwing Files will be moved to the archive now!"
find $DOWNLOADPATH/output -mtime +14 -exec mv -v {} $DOWNLOADPATH/archive \; >> $LOGPATH


#echo Delete garbage >> $LOGPATH
#find $DOWNLOADPATH/Incomming -type f \( -iname \*."rar" -o -iname \*."URL" -o -iname \*."jpg" -o -iname \*."txt" \) -delete
#find $DOWNLOADPATH/Incomming -type d -name @eaDir -exec rm -rf {} \;
#find $DOWNLOADPATH/Incomming -type f -iname @SynoEAStream -delete
#find $DOWNLOADPATH/Incomming -type f \( -iname \*.DS_Store \) -delete

#echo Delete empty folders
#find $DOWNLOADPATH/Incomming/* -type d -empty -delete

Problem ist, dass das for-Command (bspw. im 1080p-Block) fehlschlägt, sobald keine Files im entsprechenden Ordner liegen. Irgendeine Idee, wie ich hier vorgehen kann? (Möglichst ohne großartiges if else gefriemel?)

[Bild: Rz3JNLI.gif]
Meine Beiträge stehen unter der MIT-Lizenz:D

(09.04.2016 13:26)tk1908 schrieb:  externe HDD am Router? Klar ich tausch mein Auto gegen nen Tretroller mit Bremsklotz.
30.05.2023 20:13
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
s4ndwichMakeR Offline
Realitätsfeinmotoriker‮

Beiträge: 5.195
Registriert seit: Jul 2008
Beitrag #808
RE: Der Code-Schnippsel-Thread
(30.05.2023 20:13)tk1908 schrieb:  Problem ist, dass das for-Command (bspw. im 1080p-Block) fehlschlägt, sobald keine Files im entsprechenden Ordner liegen. Irgendeine Idee, wie ich hier vorgehen kann? (Möglichst ohne großartiges if else gefriemel?)

Klingt, als könne der Wildcard-Ausdruck nicht expandiert (aufgelöst) werden und wird folglich wörtlich übergeben. Entweder benutzt du auch dort find, das prinzipiell nur existierende Dateien findet (anders als for, das nur über eine von der Shell übergebene Liste iteriert) oder prüfst auf Existenz mit [ -e "$f" ] && ffmpeg ….

Mag sein, dass es eine elegantere Lösung gibt (irgendeine via set setzbare Shell Option?), weil das ja eine verbreitete Stolperfalle sein dürfte. Ich stand aber bisher nicht vor dem Problem.

• • • – • – – • – –
31.05.2023 00:02
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.221
Registriert seit: Jul 2008
Beitrag #809
RE: Der Code-Schnippsel-Thread
(31.05.2023 00:02)s4ndwichMakeR schrieb:  Mag sein, dass es eine elegantere Lösung gibt (irgendeine via set setzbare Shell Option?), weil das ja eine verbreitete Stolperfalle sein dürfte. Ich stand aber bisher nicht vor dem Problem.

Ja, für Bash gibt es nullglob:
Zitat:nullglob: If set, bash allows patterns which match no files (see Pathname Expansion) to expand to a null string, rather than themselves.

Code:
/var/empty$ for x in *.mp4; do echo "verarbeite $x"; done
verarbeite *.mp4
/var/empty$ shopt -s nullglob
/var/empty$ for x in *.mp4; do echo "verarbeite $x"; done
Das funktioniert, weil for ohne in (bzw. in ohne Argumente) gültige Syntax ist.
In diesem Fall sollte es nicht schaden, die Option für das ganze Skript zu setzen.

Erinnerst du dich an #whfclassics? Es ist zurück! In Pog-Form.
06.06.2023 09:55
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste