it-swarm.com.de

Prüfen Sie, ob im Verzeichnis ein bestimmter Dateityp/eine bestimmte Erweiterung vorhanden ist

Wie würden Sie sagen, ob Dateien mit einer bestimmten Erweiterung in einem Verzeichnis mit bash vorhanden sind?

So etwas wie

if [ -e *.flac ]; then 
echo true; 
fi 
57
Wurlitzer
#!/bin/bash

count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
echo true
fi 
71
JeremyWeir
#/bin/bash

myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then 
    echo true 
else 
    echo false
fi
14
wkl

Dies verwendet ls (1), wenn keine flac-Dateien vorhanden sind, ls meldet Fehler und das Skript wird beendet. Andernfalls wird das Skript fortgesetzt und die Dateien können bearbeitet werden

#! /bin/sh
ls *.flac  >/dev/null || exit
## Do something with flac files here
11
frayser
shopt -s nullglob
if [[ -n $(echo *.flac) ]]    # or [ -n "$(echo *.flac)" ]
then 
    echo true
fi
7
#!/bin/bash
files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l)
if [ "$files" != "0" ]
then
echo "Some files exists."
else
echo "No files with that extension."
fi
3
Ruel
   shopt -s nullglob
   set -- $(echo *.ext)
    if [ "${#}" -gt 0 ];then
      echo "got file"
    fi
2
ghostdog74

Die Top-Lösung (if [ -e *.flac ];) hat bei mir nicht funktioniert und ergibt: [: too many arguments 

if ls *.flac >/dev/null 2>&1; dann wird es funktionieren.

2
Erik Buitenhuis

Sie müssen vorsichtig sein, welche Flagge Sie in Ihre if-Anweisung werfen und wie sie sich auf das gewünschte Ergebnis bezieht.

Wenn Sie nach nur regulären Dateien und nicht nach anderen Arten von Dateisystemeinträgen suchen möchten, müssen Sie Ihr Code-Gerüst folgendermaßen ändern:

if [ -f file ]; then
echo true;
fi

Die Verwendung von -f beschränkt die if auf reguläre Dateien, wohingegen -e umfangreicher ist und mit allen Typen von Dateisystemeinträgen übereinstimmt. Es gibt natürlich andere Optionen wie -d für Verzeichnisse usw. Siehe http://tldp.org/LDP/abs/html/fto.html für eine gute Auflistung.

Wie aus @msw hervorgeht, verschluckt test (d. H. [), wenn Sie versuchen, mehr als ein Argument zu verwenden. Dies kann in Ihrem Fall der Fall sein, wenn der Glob für *.flac mehr als eine Datei zurückgegeben hat. Versuchen Sie in diesem Fall, Ihren if-Test in einer Schleife einzuhüllen

for file in ./*.pdf
do
    if [ -f "${file}" ]; then
    echo 'true';
    break
    fi
done

Auf diese Weise break in der ersten Instanz der gewünschten Dateierweiterung und können Sie den Rest des Skripts fortsetzen.

2
dtlussier

nur bash:

any_with_ext () ( 
    ext="$1"
    any=false
    shopt -s nullglob
    for f in *."$ext"; do
        any=true
        break
    done
    echo $any 
)

if $( any_with_ext flac ); then
    echo "have some flac"
else 
    echo "dir is flac-free"
fi

Ich verwende Klammern anstelle von geschweiften Klammern, um sicherzustellen, dass eine Subshell verwendet wird (Sie möchten Ihre aktuelle nullglob-Einstellung nicht beeinträchtigen).

1
glenn jackman

Hier ist eine Lösung, die keine externen Befehle verwendet (d. H. Keine ls), sondern eine Shell-Funktion. Getestet in bash:

shopt -s nullglob
function have_any() {
    [ $# -gt 0 ]
}

if have_any ./*.flac; then
    echo true
fi

Die Funktion have_any verwendet $#, um ihre Argumente zu zählen, und [ $# -gt 0 ] prüft dann, ob mindestens ein Argument vorhanden ist. Die Verwendung von ./*.flac anstelle von *.flac im Aufruf von have_any dient dazu, Probleme zu vermeiden, die durch Dateien mit Namen wie --help verursacht werden.

1
jochen

Hier ist eine ziemlich einfache Lösung:

if [ "$(ls -A | grep -i \\.flac\$)" ]; then echo true; fi

Wie Sie sehen können, ist dies nur eine Codezeile, aber es funktioniert gut genug. Es sollte sowohl mit bash als auch mit einem posix-kompatiblen Shell-ähnlichen Gedankenstrich funktionieren. Es ist auch unabhängig von Groß- und Kleinschreibung und es ist egal, welche Art von Dateien (regulär, Symlink, Verzeichnis usw.) vorhanden sind. Dies kann hilfreich sein, wenn Sie einige Symlinks haben oder etwas.

0
TSJNachos117

Mit -f können Sie prüfen, ob Dateien eines bestimmten Typs vorhanden sind:

#!/bin/bash

if [ -f *.flac ] ; then
   echo true
fi 
0
Uzi

Zum Abschluss mit zsh:

if [[ -n *.flac(#qN) ]]; then
  echo true
fi

Dies ist am Ende des Abschnitts Conditional Expressions im zsh-Handbuch aufgeführt. Da [[ das Globbing von Dateinamen deaktiviert, müssen Sie die Generierung von Dateinamen mithilfe von (#q) am Ende der Globbing-Zeichenfolge erzwingen. Anschließend wird mit der Option N (Option NULL_GLOB) die generierte Zeichenfolge leer, falls keine Übereinstimmung vorliegt.

0
Iso