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?
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:
Alle bisherigen Antworten (sowie Ihr Beispiel in der Frage) setzen voraus, dass Sie touch
alles 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 find
Implementierung die Nicht-Standard -mindepth
/ -maxdepth
Prädikate nicht unterstützt :
$ find . ! -name . -prune -type d -exec touch {} +
Dies:
$ touch -c -- */
Sollte in den meisten Shells funktionieren, außer dass:
touch
Symlinks zu Verzeichnissen angezeigt*
in Schalen anders als csh
, tcsh
, zsh
, fish
oder die Thompson Schale (die einen Fehler würde berichten statt). Hier verwenden wir -c
, um es zu umgehen, obwohl das noch touch
eine Nicht-Verzeichnis-Datei genannt werden könnte *
.Mit zsh
, nur zu touch
Verzeichnissen, auch zu versteckten:
touch -- *(D/)
{} \+
ist speziell find
- lesen Sie die Manpage für mehr. Ich denke, touch -c ./*/
würde auch funktionieren.
-maxdepth 1
in den Befehl aufnehmen, damit er find
nicht in Unterordner verschoben wird. OP scheint nur die Ordner in der CWD berühren zu wollen, nicht die Unterordner.
Versuchen
touch ./*
Es vermeidet die unnötige for
Schleife, 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 touch
meisten Implementierungen die -c
Option (auch --no-create
in GNU-Versionen genannt), keine nicht vorhandenen Dateien zu erstellen, d. H
touch -c ./*
Siehe auch die guten Referenzen in jasonwryan Antwort sowie diese ein .
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 .
*
keine Dateien und Verzeichnisse erfasst werden, deren Name mit einem Punkt beginnt. Eine Möglichkeit, dies zu beheben, besteht darin, die dotglob
Shell-Option über zu aktivieren shopt -s dotglob
.
for file in `find .`; do touch $file; done