find: Änderung in Debian 12 ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

find: Änderung in Debian 12 ?

Beitrag von mrserious » 15.06.2023 18:39:47

Hallo,

habe vor einer Weile mal ein kleines Skript geschrieben, das mir die Dateien seit einem bestimmten Datum aus einem Verzeichnis heraus kopiert:

Code: Alles auswählen

find /dir -type f -newermt 2023-01-01 -exec cp --parents -at /zielverzeichnis {} +
Seit des Updates auf Debian 12 erhalte ich beim Ausführen des Skripts nun Meldungen, die ich noch nicht ganz zuordnen kann.
Könnt ihr mich aufklären?

Code: Alles auswählen

cp: „dir/irgend/ein/Ordner“: Datei oder Verzeichnis nicht gefunden

chrbr
Beiträge: 550
Registriert: 29.10.2022 15:53:26

Re: find: Änderung in Debian 12 ?

Beitrag von chrbr » 15.06.2023 18:59:23

Kann es sein, dass das Zielverzeichnis seit dem Upgrade nicht mehr existiert?

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 15.06.2023 19:33:11

Wieso nennt die Fehlermeldung denn eigentlich einen *Ordner*, wenn der find-Aufruf nur Dateien auswaehlt?

Was gibt der find-Befehl aus, wenn du `-exec' und den Rest der weglaesst? (Dann sollten die gefundenen Dateien aufgelistet werden.) Passen die Pfade da?

Wo ist der Slash vor `dir' hingekommen? Das macht fuer mich keinen Sinn. Ist das wirklich das ganze Script, oder gibt's da noch irgendwelche Variablen oder so?
Use ed once in a while!

mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

Re: find: Änderung in Debian 12 ?

Beitrag von mrserious » 16.06.2023 09:23:33

Guten Morgen,

entschuldigt, in dem Versuch, es für euch leichter zu machen habe ich tatsächlich die Variablen weggelassen :roll:

Leider funktioniert's aber auch nicht, wenn ich von Hand alles auf der Shell eingebe.
Wichtig: Die Daten werden aber trotzdem korrekt in das Zielverzeichnis kopiert!
Trotzdem hier einmal das Skript inkl. Variablen:

Code: Alles auswählen

zielverzeichnis="/ein/anderer/Ordner"
datum="2023-06-16"

mkdir $zielverzeichnis/subdir

find /dir -type f -newermt $datum -exec cp --parents -at $zielverzeichnis/subdir {} +

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 16.06.2023 09:56:31

Generell sollte man alle Variablenexpansionen double-quoten. Hier sollte es zwar keinen Unterschied machen, aber sicher ist sicher, und bevor man tiefer in die Fehlersuche einsteigt, sichert man besser die Grundlagen. ;-)

Mich irritiert immer noch die Fehlermeldung, dass dort der Slash am Anfang fehlt. Bist du dir sicher, dass die korrekt so ist. Du hast ja alle Pfade anonymisiert. Nicht dass du aus Versehen den Slash entfernt hast.

Wenn du sagst, dass etwas kopiert wird, dann wende das Script doch mal ohne die Datumsbedingung an, dann sollten *alle* Dateien darin kopiert werden. Dann kannst du den Ausgangs- und Zielordner mit `diff -rq' vergleichen, ob auch wirklich keine fehlt.

Zum Debuggen kannst du mit `set -x' die Ausgabe der ausgefuehrten Befehle einschalten oder einfach zwischen `-exec' und `cp' ein `echo' setzen, dann wird der Kopierbefehl nicht ausgefuehrt, sondern im Terminal ausgegeben. Vielleicht faellt da irgendwas auf.

Du solltest diese Dinge schrittweise durchgehen, um deine Annahmen zu pruefen.
Use ed once in a while!

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

Re: find: Änderung in Debian 12 ?

Beitrag von MSfree » 16.06.2023 10:03:37

mrserious hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 09:23:33

Code: Alles auswählen

zielverzeichnis="/ein/anderer/Ordner"
mkdir $zielverzeichnis/subdir
Voraussetzung dafür, daß /ein/anderer/Ordner/subdir mit mkdir angelegt werden kann, ist, daß /ein/anderer/Ordner bereits existieren. Das war aber schon immer so.

Wenn du die übergeordneten Verzeichnisse mitanlegen lassen willst, mußt du

Code: Alles auswählen

mkdir -p $zielverzeichnis/subdir
verwenden. Das Stellt sicher, daß zuerst /ein erzeugt wird, sollte es nicht exisieren, dann /ein/anderer und schließllich /ein/anderer/Ordner, bevor versucht wird /ein/anderer/Ordner/subdir anzulegen.

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 16.06.2023 10:13:10

@MSfree: Das ist ein guter Hinweis, der das Script robuster macht. Fuer die Fehlermeldung scheint mir das aber nicht verantwortlich zu sein. Die bezieht sich doch auf die Quelldatei und nicht auf das Zielverzeichnis. Ich vermute also, dass das Zielverzeichnis korrekt angelegt worden ist, denn sonst haette `mkdir' schon einen Fehler geworfen.
Use ed once in a while!

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

Re: find: Änderung in Debian 12 ?

Beitrag von MSfree » 16.06.2023 10:33:17

Meillo hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 10:13:10
Die bezieht sich doch auf die Quelldatei und nicht auf das Zielverzeichnis.
Was macht dich da so sicher?

Die Meldung aus dem OP:

Code: Alles auswählen

cp: „dir/irgend/ein/Ordner“: Datei oder Verzeichnis nicht gefunden
könnte auch bedeuten, daß das Ziel nicht gedunden wurde, was dann an dem mkdir liegen könnte.

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: find: Änderung in Debian 12 ?

Beitrag von tobo » 16.06.2023 10:53:23

MSfree hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 10:33:17
Meillo hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 10:13:10
Die bezieht sich doch auf die Quelldatei und nicht auf das Zielverzeichnis.
Was macht dich da so sicher?
Dass die Daten korrekt ins Zielverzeichnis übertragen wurden?

Es geht einfach nichts über reguläre Ausgaben der Konsole...

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 16.06.2023 10:59:38

MSfree hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 10:33:17
Meillo hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 10:13:10
Die bezieht sich doch auf die Quelldatei und nicht auf das Zielverzeichnis.
Was macht dich da so sicher?

Die Meldung aus dem OP:

Code: Alles auswählen

cp: „dir/irgend/ein/Ordner“: Datei oder Verzeichnis nicht gefunden
könnte auch bedeuten, daß das Ziel nicht gedunden wurde, was dann an dem mkdir liegen könnte.
Dann wuerde `mkdir' schon die Fehlermeldung liefern. Wenn `mkdir' funktioniert, dann sollte `cp' auch funktionieren. Mir faellt kein Fall ein, bei dem ersteres geht aber zweiteres wegen dem Zielverzeichnis nicht.

Zudem muesste dann in der Fehlermeldung von `cp' der Zielpfad (/ein/anderer/Ordner) stehen und nicht der Quellpfad (dir/irgend/ein/Ordner).
Use ed once in a while!

mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

Re: find: Änderung in Debian 12 ?

Beitrag von mrserious » 16.06.2023 11:44:27

Also ich habe die Pfade gerade noch einmal geprüft: Sie sind definitiv korrekt.
Danke für den Hinweis zu "mkdir -p" ! Auch hier ist es aber so: Die Pfade haben sich durch das Neuinstallieren des Systems nicht geändert, da sie nicht auf der root-Partition liegen.
Es sind also nach wie vor alle Verzeichnisse und Unterverzeichnisse korrekt vorhanden.

Falls ich das missverständlich formuliert habe:
Effektiv funktioniert auch alles! Sowohl per Skript, als auch per händischem Ausführen mit hart-codierten Pfaden, Datum etc. klappt alles einwandfrei!
Ich würde aber gern verstehen, woher diese Fehlermeldung stammt.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: find: Änderung in Debian 12 ?

Beitrag von JTH » 16.06.2023 11:47:26

Man könnte dem cp-Aufruf hier nochmal ein -v mitgeben. Mit Glück gibt das nen Indikator, bei welcher Quelle oder welchem Ziel es hapert.

Nebenbei, ich kann nicht ganz nachstellen, in welchem Szenario cp die Meldung
mrserious hat geschrieben: ↑ zum Beitrag ↑
15.06.2023 18:39:47

Code: Alles auswählen

cp: „dir/irgend/ein/Ordner“: Datei oder Verzeichnis nicht gefunden
überhaupt ausgibt (das könnt zum Eingrenzen helfen). In src/cp.c und po/de.po der coreutils tauchen nur Meldungen auf, die noch wenigstens einen kurzen weiteren Hinweis angeben.

Wenn die angegebene Quelldatei nicht existiert:

Code: Alles auswählen

$ LANGUAGE=de_DE cp non_existent foobar
cp: der Aufruf von stat für 'non_existent' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
Wenn der Zielordner (noch) nicht existiert:

Code: Alles auswählen

$ LANGUAGE=de_DE cp -t non_existent foobar
cp: Zielverzeichnis 'non_existent': Datei oder Verzeichnis nicht gefunden
Oder ist in dem Zitat das „Zielverzeichnis“ unterschlagen? ;)

mrserious hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 11:44:27
da sie nicht auf der root-Partition liegen.
Geht es um ein „exotisches“ Dateisystem? Sind Dateien oder Ordner involviert, die einem anderen als dem aufrufenden Benutzer gehören?
Manchmal bekannt als Just (another) Terminal Hacker.

mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

Re: find: Änderung in Debian 12 ?

Beitrag von mrserious » 16.06.2023 11:51:41

In der Tat liegen die Daten auf ZFS.
Aber: Ich habe auch bereits alles auf XFS nachgestellt (1 zu 1 kopiert) und erhalte den selben Fehler.
Das würde ich jetzt also erstmal ausschließen.
Für den Test läuft erstmal alles mit root-Rechten, das sollte also passen.

Edit: Das Slash im Quellverzeichnis ist m.E. korrekt.
Der Quellordner liegt tatsächlich direkt unterhalb von / und ist hart im Skript kodiert.
Zumindest war es vorher ganz genauso.

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 16.06.2023 11:55:51

Ich moechte meine Hinweise von oben nochmal wiederholen, denn die werden uns der Loesung naeher bringen:
Meillo hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 09:56:31
Wenn du sagst, dass etwas kopiert wird, dann wende das Script doch mal ohne die Datumsbedingung an, dann sollten *alle* Dateien darin kopiert werden. Dann kannst du den Ausgangs- und Zielordner mit `diff -rq' vergleichen, ob auch wirklich keine fehlt.

Zum Debuggen kannst du mit `set -x' die Ausgabe der ausgefuehrten Befehle einschalten oder einfach zwischen `-exec' und `cp' ein `echo' setzen, dann wird der Kopierbefehl nicht ausgefuehrt, sondern im Terminal ausgegeben. Vielleicht faellt da irgendwas auf.
Use ed once in a while!

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 16.06.2023 11:57:11

mrserious hat geschrieben: ↑ zum Beitrag ↑
16.06.2023 11:51:41
Edit: Das Slash im Quellverzeichnis ist m.E. korrekt.
Der Quellordner liegt tatsächlich direkt unterhalb von / und ist hart im Skript kodiert.
Zumindest war es vorher ganz genauso.
Aber wieso fehlt er in der Fehlerausgabe? Ich kann mir nicht erklaeren, wie das passieren kann (jedenfalls nicht durch den Code, den du uns gepostet hast).
Use ed once in a while!

mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

Re: find: Änderung in Debian 12 ?

Beitrag von mrserious » 17.06.2023 15:55:42

So!

Endlich Zeit dafür gehabt ;-)
Also: Ohne Datumsangabe:

Code: Alles auswählen

find /quelle -type f -exec cp --parents -at /ziel {} +
Läuft wieder durch mit der bekannten Meldung "Datei oder Verzeichnis nicht gefunden", aber: "diff -rq" scheint hier nichts sinnvolles zu liefern?
Ich habe mir sogar die Mühe gemacht, von Hand zu schauen: Es sind alle Dateien im Zielverzeichnis, /quelle und /ziel sind somit identisch.

Den Rest probiere ich gleich noch aus ;-)

Warum das Slash fehlt kann ich mir tatsächlich auch nicht erklären!


Edit: Für den Test liegen beide Verzeichnisse auf XFS und was mich so stark irritiert:
Außer des Updates auf Debian 12 wurde nichts verändert.
Skripte, Pfade, ... alles identisch.

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

Re: find: Änderung in Debian 12 ?

Beitrag von Meillo » 17.06.2023 17:42:58

mrserious hat geschrieben: ↑ zum Beitrag ↑
17.06.2023 15:55:42
"diff -rq" scheint hier nichts sinnvolles zu liefern?
Keine Ausgabe bedeutet bei diff, dass die beiden Verzeichnisse identisch sind. Also alles gut.


Nun mal sehen, wie die Ausgabe mit `echo' oder `set -x' aussieht. Dort sollte sich der in der Fehlermeldung erwaehnte Pfad wohl irgendwo finden lassen. (Es waere gut wenn du eine nicht oder moeglichst wenig anonymisierte Ausgabe posten koenntest.)
Use ed once in a while!

mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

Re: find: Änderung in Debian 12 ?

Beitrag von mrserious » 21.06.2023 06:31:25

Guten Morgen,

entschuldige, ich habe momentan wenig Zeit.
Kurzes Update:

Ich verstehe total, was du mit dem Anonymisieren meinst.
Mein Problem ist: Die Original-Verzeichnisse sind etliche TB groß.
Mir bleibt hier nichts anderes übrig, als das Szenario nachzustellen.
Ich mache aber alles auf dem selben Debian, den selben Mountpoints etc., es ist also so nah wie möglich an der Realität.

Was ich definitiv sagen kann: Das Skript / händisches Ausführen liefert definitiv korrekte Ergebnisse, es sind alle Dateien vorhanden (unter Debian 11 hatte ja ohnehin alles makellos funktioniert).

Ich schaue mal, möglichst bald die von dir vorgeschlagenen Tests machen zu können!


Edit:
FALSCH!
Ich habe das Skript gerade mehrere Male nacheinander laufen lassen, zwischendurch das Ziel-Verzeichnis immer wieder geleert.
Ergebnis: Verschiedene Ergebnisse!
Puh, langsam zweifle ich an mir. Was läuft denn hier falsch? Das ist doch ansich eine sehr einfache find-Zeile ohne viel Magie?

mrserious
Beiträge: 266
Registriert: 22.06.2013 12:12:03

Re: find: Änderung in Debian 12 ?

Beitrag von mrserious » 21.06.2023 19:08:06

Update:

Mir ist ein Test eingefallen, den ich mal eben zwischenschieben kann:

Habe die Zeile verändert:

vorher:

Code: Alles auswählen

find /quelle -type f -exec cp --parents -at /ziel {} +
nachher:

Code: Alles auswählen

cd /quelle
find . -type f -exec cp --parents -at /ziel {} +
Ergebnis: Die Fehlermeldung ist weg.
Kann sich das jemand erklären?
/quelle ist ein ganz normaler Ordner, direkt unterhalb von /, der auf einem XFS-Dateisystem liegt.
In meinen Augen ist daran nichts ungewöhnliches.

Update 2:
Ich habe den Fehler entdeckt, warum scheinbar im Zielverzeichnis Dateien fehlten:
Versehentlich lag das Ziel auf einem ZFS-Volume, das Kompression aktiviert hat.
Damit liefert "du" natürlich nicht sofort einen sinnvollen Wert.
Der Fehler geht also klar auf mich.

Antworten