2016-06-03 7 views
0

ich ein Skript Schreiben von Dateien (Dropbox Kamera Uploads zum Beispiel,) zu bewegen, um Jahr benannte Ordner, wie folgt aus:ignorieren leer Matches während glob auf bash for-Schleife erweitert

#!/bin/bash 
# 
# Separate (camera) images on directory 
# to year named folders. 
# 
# All files must be named as "yyyy-mm-dd HH:MM:SS.ext" 
# 
for img in *.{jpg,jpeg,png}; do 
    year=${img:0:4} 
    [ -d "$year" ] || mkdir "$year" 
    mv -iv "$img" "$year/" 
done 

Das Skript funktioniert wie erwartet für Matchin-Dateien, aber wenn keine Datei mit einer Erweiterung vorhanden ist, wird es auf *.ex (die ersten beiden Erweiterungszeichen) erweitert. Dann erstellt es leere Verzeichnisse wie folgt:

'*.jp' 
'*.jp' 
'*.pn' 

Wie kann ich einfach keine passenden Dateien ignorieren?

Antwort

3

Sie möchten die nullglob Option; Muster, die zu nichts passen, werden ignoriert und nicht wörtlich behandelt.

shopt -s nullglob 
for f in *.does_not_exist; do 
    echo "This won't be reached" 
done 
1

Sie haben zwei Hauptoptionen. Eine, wie @chepner vermuten lässt, ist auf nullglob zu drehen, die unerreichte Klackse zu null erweitern macht:

shopt -s nullglob 

Die andere ist, zu testen, um zu sehen, ob die Datei vorhanden ist, bevor mit ihm etwas zu tun:

for img in *.{jpg,jpeg,png}; do 
    if [ -f "$img" ]; then # not true for '*.jpg' etc 
    year=${img:0:4} 
    [ -d "$year" ] || mkdir "$year" 
    mv -iv "$img" "$year/" 
    fi 
done 

Sie können auch mkdir -p verwenden und den Test -d überspringen.

+0

Ja, ich den Test verwenden würde. Aber die Nullglob-Optionen sehen sauberer aus. Nicht sicher, ob es sicherer ist. – paulodiovani

+0

Danke für den '-p' Tipp. – paulodiovani

+0

@paulodiovani Der Hauptunterschied ist, dass 'nullglob' Bash-spezifisch ist, der Test ist für die meisten Shells portabel. – Barmar

0

können Sie überprüfen, um zu sehen, ob die Datei zuerst existiert, dann continue die Schleife, wenn nicht

#!/bin/bash 
# 
# Separate (camera) images on directory 
# to year named folders. 
# 
# All files must be named as "yyyy-mm-dd HH:MM:SS.ext" 
# 
for img in *.{jpg,jpeg,png}; do 
    [ ! -f "$img" ] && continue 
    year=${img:0:4} 
    [ -d "$year" ] || mkdir "$year" 
    mv -iv "$img" "$year/" 
done