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 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:
touch Symlinks zu Verzeichnissen angezeigt*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/)
{} \+ist speziell find- lesen Sie die Manpage für mehr. Ich denke, touch -c ./*/würde auch funktionieren.
-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.
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 .
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 dotglobShell-Option über zu aktivieren shopt -s dotglob.
for file in `find .`; do touch $file; done