test -f datei* [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 802
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

test -f datei* [gelöst]

Beitrag von xcomm » 03.08.2016 11:29:07

Hi Gemeinde,

wie würde man das elegant machen? Ich will in Bash schauen, ob Dateien da sind und die dann moven.

Code: Alles auswählen

test -f /dir/datei* && ( mv  /dir/datei* /dir2 )

Code: Alles auswählen

/bin/sh: Zeile 0: test: Zu viele Argumente.

Geht das mit Test, oder muss ich was mit find und wc bauen?

Danke, xcomm
Zuletzt geändert von xcomm am 12.08.2016 13:07:44, insgesamt 1-mal geändert.

Benutzeravatar
Blackbox
Beiträge: 4289
Registriert: 17.09.2008 17:01:20
Lizenz eigener Beiträge: GNU Free Documentation License

Re: test -f datei*

Beitrag von Blackbox » 03.08.2016 11:51:05

xcomm hat geschrieben:Geht das mit Test, oder muss ich was mit find und wc bauen?
Was genau möchtest du denn erreichen?
Eigenbau PC: Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Desktop PC: Dell Inspiron 530 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Notebook: TUXEDO BU1406 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Alles Minimalinstallationen und ohne sudo/PA/PW.
Rootserver: Rocky Linux 9.3 - Kernel: 5.14

Freie Software unterstützen, Grundrechte stärken!

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: test -f datei*

Beitrag von MSfree » 03.08.2016 11:51:21

xcomm hat geschrieben:wie würde man das elegant machen? Ich will in Bash schauen, ob Dateien da sind und die dann moven.
Test kann immer nur einen Ausdruck auswerten. Das Sternchen führt aber ggfls. zu mehreren Dateinamen und somit zu einem ungültigen Ausdruck für Test.

Du könntest dir eine Dateiiste erstellen und jede Datei einzeln moven:

Code: Alles auswählen

#!/bin/bash

liste=`ls /dir/datei*`

for dateiname in $liste
do
  mv $dateiname /dir2
done
Der Test kann hierbei komplett entfallen, weil list leer wäre, wenn es keine Dateien gäbe und die for-Schleife dann auch nicht durchlaufen wird.

Aber ein einfaches mv /dir/datei* dir2 würde den gleichen Zweck erfüllen. :mrgreen:

Benutzeravatar
stollenreiter
Beiträge: 402
Registriert: 10.08.2004 16:30:47
Wohnort: Bremen

Re: test -f datei*

Beitrag von stollenreiter » 03.08.2016 12:05:32

Ginge nicht auch

Code: Alles auswählen

find /such_dir/ -type f -name datei*.* -exec mv {} /ziel_dir/  \;
Ungetestet.
Gruß Stollenreiter
wat mutt, dat mutt
Mein Jakobsweg heißt Darb al-Arba'in

wanne
Moderator
Beiträge: 7548
Registriert: 24.05.2010 12:39:42

Re: test -f datei*

Beitrag von wanne » 03.08.2016 12:06:30

Etwas genauer (Keine Rekursion in Unterordner.)

Code: Alles auswählen

find /dir/ -type f -name "datei*" -maxdepth 1 -exec mv "{}"  "../dir2/{}" \; 
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
xcomm
Beiträge: 802
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: test -f datei*

Beitrag von xcomm » 03.08.2016 12:16:45

Ok - also doch eher mit find. :-)

Ich wollte erreichen. Test ob 1 oder mehr dort sind, dann mv - sonst tue nichts.

Ist einfach nur ein Cronjob, der schauen soll, ob was dort liegt und dann wegbewegen soll.

Aber Test geht wohl nur auf exakt eine Datei.

Ok - ich nehme find.

Danke, xcomm

Benutzeravatar
xcomm
Beiträge: 802
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: test -f datei*

Beitrag von xcomm » 03.08.2016 12:20:09

Ja, dass einfache wirft leider einen Fehler im Cronjob, wenn dort nichts ist:

Code: Alles auswählen

mv /dir/datei* dir2
Oder könnte man das bei mv mit einem Schalter unterbinden?

Gut ich könnte den Cron auch auf 2>&1 nach /dev/null senden. Aber ich dachte, ich teste vorher, ob was dort ist.

Naja, denke, benutze jetzt find.

Danke, xcomm

Benutzeravatar
Meillo
Moderator
Beiträge: 9233
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: test -f datei*

Beitrag von Meillo » 03.08.2016 12:34:12

Das finde ich es am simpelsten und klarsten:

Code: Alles auswählen

mv /dir/datei* dir2 2>/dev/null
Use ed once in a while!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: test -f datei*

Beitrag von rendegast » 03.08.2016 13:25:15

xcomm hat geschrieben: Ist einfach nur ein Cronjob, der schauen soll, ob was dort liegt und dann wegbewegen soll.
Debianincron
wenn etwas erstellt wird, kann es (auch mit Verzögerung) Aktionen ausführen.
Verfeinert würde ich nicht ein CREATE oder OPEN als Signal nehmen,
sondern eher die Beendigung eines Zugriffs, Richtung CLOSE_WRITE.

Code: Alles auswählen

       IN_ACCESS           File was accessed (read) (*)
       IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
       IN_CLOSE_WRITE      File opened for writing was closed (*)
       IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
       IN_CREATE           File/directory created in watched directory (*)
       IN_DELETE           File/directory deleted from watched directory (*)
       IN_DELETE_SELF           Watched file/directory was itself deleted
       IN_MODIFY           File was modified (*)
       IN_MOVE_SELF        Watched file/directory was itself moved
       IN_MOVED_FROM       File moved out of watched directory (*)
       IN_MOVED_TO         File moved into watched directory (*)
       IN_OPEN             File was opened (*)
aber das kann ja ausprobiert werden.




EDIT

Code: Alles auswählen

/srv/share/pdf-to-img IN_CLOSE_WRITE pdf-to-img.sh $@/$# $%
ist passabel, um in die Freigabe kopierte *.pdf mithilfe eines Skripts pdf-to-img.sh automatisch in *.png umzuwandeln.
Zuletzt geändert von rendegast am 06.08.2016 04:44:36, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Trollkirsche
Beiträge: 497
Registriert: 08.08.2015 15:03:09
Wohnort: Schweiz Zürich

Re: test -f datei*

Beitrag von Trollkirsche » 04.08.2016 23:43:20

Hi,

Du willst schauen, ob Dateien in einem Verzeichnis vorhanden sind, und wenn ja, in ein spezifisches Verzeichnis verschieben?

Wenn ja :

[ "$(ls -A /das/zu/checkende/verzeichnis/)" ] && echo "Verzeichnis nicht leer" || echo "Verzeichnis leer"

oder in deinem Falle:

[ "$(ls -A /das/zu/checkende/verzeichnis/)" ] && mv /nach/dir/

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: test -f datei*

Beitrag von pferdefreund » 05.08.2016 08:04:43

oder echo "dummy" > /deinVerzeichnis/dummy
find -name test*........
rm /dein/verzeichnis/dummy.
Dann ist immer eine da und es gibt nur einen Fehler wenn wirklich was falsch ist.
Quasi ein Pseudosatz wie bei VSAM-KSDS damit man den mit open i-o oeffnen kann.

Benutzeravatar
xcomm
Beiträge: 802
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: test -f datei*

Beitrag von xcomm » 06.08.2016 11:39:21

@rendegast,

Kannst du das noch ein bisschen erklären? Mir fehlt da ein Schritt zum Verständnis?

@Trollkirsche

das mit dem ls -A /dir/ ist genial, es geht nur leider nicht, da es auch noch andere Dateien dort geben kann.
Ein ls -A /dir/dateiname* geht laeider nicht.

Danke, xcomm

Benutzeravatar
xcomm
Beiträge: 802
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: test -f datei*

Beitrag von xcomm » 06.08.2016 11:48:09

Nehme jetzt im Prinzip find um die Fehler/STDERR in dem Cronjob nicht zu deaktivieren zu müsste.

Code: Alles auswählen

find /dira -name date* -exec mv {} /dirb \;
Danke an alle!

xcomm

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: test -f datei*

Beitrag von rendegast » 06.08.2016 13:44:11

xcomm hat geschrieben: @rendegast,
Kannst du das noch ein bisschen erklären? Mir fehlt da ein Schritt zum Verständnis?
Ein Bsp. für incron (hier angewendet)
rendegast hat geschrieben:EDIT

Code: Alles auswählen

/srv/share/pdf-to-img IN_CLOSE_WRITE pdf-to-img.sh $@/$# $%
ist passabel, um in die Freigabe kopierte *.pdf mithilfe eines Skripts pdf-to-img.sh automatisch in *.png umzuwandeln.
(Der letzte Eintrag '$%' (Ereignis) ist "nur so da", wird im Skript nicht verarbeitet)
Die Sache funktioniert nicht-rekursiv
(mein Skript würde zwar auch filtern s.u.,
aber 'systemctl status incron' gibt keine Ereignisse
/ueberwachtesVerzeinis/sub/sub/datei).
Das IN_CLOSE_WRITE ergibt sich wohl aus der Art der Benutzung als share,
ein MOVED-Ereignis tritt dabei nicht auf.
imo wichtig: Der an das Skript übergebene Pfad/Dateiname '$@/$#' erfolgt backslash-gequotet, Bsp.
Name\ \ der\ \ Datei\ \ .pdf
was ich im Skript filtere per

Code: Alles auswählen

FILE=$1
um dann im weiteren sauber gequotet zu arbeiten

Code: Alles auswählen

file "$FILE" | grep -q -i ": PDF document" || exit 0
    NAME="$(basename "$FILE" .pdf)"
...
(Das 'basename' würde dabei auch einen rekursiven Pfad filtern.)



Name\ \ der\ \ Datei\ \ .pdf\ \
Einige benutzte Portale liefern "Ansichts"-pdf aus ohne saubere Endung .pdf.
Würde letztendlich kein Ergebnis liefern, aber mit Schwund muß man rechnen.
------------------------------------------
Kleine Änderung im Skript

Code: Alles auswählen

    NAME="$FILE"
und es klappt mit pdf mit beliebiger Endung / beliebigem Namen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten