it-swarm.com.de

Wie überprüfe ich, ob der Befehl find nichts gefunden hat (bash, openSUSE)?

Ich weiß, dass es möglich ist, eine for-Schleife mit einem solchen find-Befehl zu verwenden

for i in `find $something`; do (...) done

ich möchte aber den Befehl find mit "if" verwenden.

Ich versuche, Fortschrittskommentare (und später Protokolldateien) zu den von meinem Skript entfernten Dateien zu erstellen. Ich muss nachsehen, ob

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS

etwas gefunden oder nicht. Wenn nicht, möchte ich echo sagen 'Sie haben keine Dateien älter als $ DAYS Tage' oder so ähnlich;)

Wie kann ich das in Shell Skript machen?

10
Izzy

Zählen Sie die Anzahl der ausgegebenen Zeilen und speichern Sie sie in einer Variablen. Testen Sie sie dann:

lines=$(find ... | wc -l)
if [ $lines -eq 0 ]; then
...
fi
9
Mark Setchell

Sie möchten find command inside an if condition verwenden. Versuchen Sie Folgendes:

 [[ ! -z `find 'YOUR_DIR/' -name 'something'` ]] && echo "found" || echo "not found"

anwendungsbeispiel:

 [Prompt] $ mkdir -p Dir/dir1 Dir/dir2/ Dir/dir3                 
 [Prompt] $ ls Dir/
 dir1  dir2  dir3
 [Prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 not found
 [Prompt] $ touch Dir/dir3/something
 [Prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 found
9
bachN

Exit 0 ist mit find einfach, Exit> 0 ist schwieriger, weil das normalerweise nur mit einem Fehler passiert. Wie auch immer, wir können es schaffen:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi
4
Steven Penny

Ich wollte dies nach Möglichkeit in einer einzigen Zeile tun, konnte aber keinen Weg finden, um den Exit-Code zu ändern, ohne einen Fehler zu verursachen.

Mit Ihrer speziellen Anforderung sollte jedoch Folgendes funktionieren:

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS | grep 'tar.gz' || echo "You don't have files older than $DAYS days"

Dies funktioniert, indem die Ausgabe von find für die gleiche Sache in eine grep übergeben wird, ein Fehler-Exit-Code zurückgegeben wird, wenn nichts gefunden wird, oder wenn dies der Fall ist, werden die gefundenen Zeilen erfolgreich wiederholt und es wird ein Echo ausgegeben.

Alles nach || wird nur ausgeführt, wenn der vorhergehende Befehl fehlschlägt.

2
Andrew Stubbs

Das Durchlaufen der Ausgabe von find kann gefährlich sein, wenn Ihre Dateinamen Leerzeichen enthalten. Wenn Sie sicher sind, dass dies nicht der Fall ist, können Sie das Ergebnis von find in einem Array speichern und dessen Größe überprüfen, um festzustellen, ob Treffer vorhanden sind:

results=( $(find -name "$something") )
if (( ${#results[@]} )) ; then
    echo Found
else
    echo Not found
fi
for file in "${results[@]}" ; do
   # ...
done
0
choroba