Berühren Sie alle Ordner in einem Verzeichnis


13

Ich versuche, die Zeitstempel aller Ordner im CWD folgendermaßen zu aktualisieren:

for file in `ls`; do touch $file; done

Aber es scheint nicht zu funktionieren. Irgendwelche Ideen warum?

Antworten:


21

Alle bisherigen Antworten (sowie Ihr Beispiel in der Frage) setzen voraus, dass Sie touchalles im Verzeichnis haben möchten , obwohl Sie "Alle Ordner berühren" gesagt haben. Wenn sich herausstellt, dass das Verzeichnis Dateien und Ordner enthält und Sie nur die Ordner aktualisieren möchten, können Sie Folgendes verwenden find:

$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +

Oder wenn Ihre findImplementierung die Nicht-Standard -mindepth/ -maxdepthPrädikate nicht unterstützt :

$ find . ! -name . -prune -type d -exec touch {} +

Dies:

$ touch -c -- */

Sollte in den meisten Shells funktionieren, außer dass:

  • Zusätzlich zu normalen Verzeichnissen werden auch touch Symlinks zu Verzeichnissen angezeigt
  • es wird versteckte weglassen
  • wenn es kein Verzeichnis oder symbolischer Link zum Verzeichnis ist, wäre es eine Datei namens erstellen *in Schalen anders als csh, tcsh, zsh, fishoder die Thompson Schale (die einen Fehler würde berichten statt). Hier verwenden wir -c, um es zu umgehen, obwohl das noch toucheine Nicht-Verzeichnis-Datei genannt werden könnte *.

Mit zsh, nur zu touchVerzeichnissen, auch zu versteckten:

touch -- *(D/)

Worum geht es bei '{} \ +'?
Javamonkey79

3
Die Syntax {} \+ist speziell find- lesen Sie die Manpage für mehr. Ich denke, touch -c ./*/würde auch funktionieren.
jw013

2
Sie sollten -maxdepth 1in den Befehl aufnehmen, damit er findnicht in Unterordner verschoben wird. OP scheint nur die Ordner in der CWD berühren zu wollen, nicht die Unterordner.
Steven Montag

1
@ JW013 Es wäre - Sie halten gute Ideen an die Antworten anderer Leute :)
Michael Mrozek

Warum sollten Sie dem Zeichen + entkommen? Gibt es Muscheln, die das interpretieren?
Witiko

11

Versuchen

touch ./*

Es vermeidet die unnötige forSchleife, die einen neuen Prozess für jede einzelne Datei hervorruft, und funktioniert für alle Dateinamen, auch für solche mit Leerzeichen oder solche, die wie Optionen aussehen (wie -t). Es würde nur dann nicht funktionieren, wenn Sie keine (Nicht-Punkt-) Dateien im Verzeichnis hätten. In diesem Fall würden Sie eine Datei mit dem Namen erstellen *. Um dies zu vermeiden, haben Sie für den speziellen Fall der touchmeisten Implementierungen die -cOption (auch --no-createin GNU-Versionen genannt), keine nicht vorhandenen Dateien zu erstellen, d. H

touch -c ./*

Siehe auch die guten Referenzen in jasonwryan Antwort sowie diese ein .


1
Was passiert, wenn Sie 1 Million Ordner im cwd haben?
Steven Montag

Wenn Sie auf Probleme vom Typ "Argumentliste zu lang" stoßen, ist es wahrscheinlich am besten, auf "schwerere" Tools wie find . -type d -maxdepth1 -print0 | xargs -0 touchoder MichaelMrozeks obige Antwort umzusteigen .
jw013

7

Sie sollten nicht versuchen, die Ausgabe von zu analysierenls .

Außerdem sollten Sie Ihre "$file"angeben, um Leerzeichen zu erfassen. Siehe http://www.grymoire.com/Unix/Quote.html

So etwas könnte das erreichen, wonach Sie streben:

for file in *; do touch "$file"; done

Weitere Informationen finden Sie in den ersten beiden Bash-Fallstricken .


2
Nah aber nicht ganz. A touch ./*sollte in den meisten Fällen funktionieren. Die forSchleife ist wirklich nicht erforderlich , da touchsie mehrere Dateien aufnehmen kann und Sie ./Dateien mit Namen wie --helprichtig behandeln müssen. Dies ist eine gute Ressource zu diesem Thema.
jw013

Warum funktioniert '*'?
Javamonkey79

@ Javamonkey79 Es ist Shell Globbing .
jw013

1
@ jw013 Hervorragender Punkt: und danke für den Wheeler Link.
Jasonwryan

Beachten Sie, dass *keine Dateien und Verzeichnisse erfasst werden, deren Name mit einem Punkt beginnt. Eine Möglichkeit, dies zu beheben, besteht darin, die dotglobShell-Option über zu aktivieren shopt -s dotglob.
Witiko

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.