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?
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 speziellfind
- lesen Sie die Manpage für mehr. Ich denke,touch -c ./*/
würde auch funktionieren.-maxdepth 1
in den Befehl aufnehmen, damit erfind
nicht in Unterordner verschoben wird. OP scheint nur die Ordner in der CWD berühren zu wollen, nicht die Unterordner.Versuchen
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 dertouch
meisten Implementierungen die-c
Option (auch--no-create
in GNU-Versionen genannt), keine nicht vorhandenen Dateien zu erstellen, d. HSiehe auch die guten Referenzen in jasonwryan Antwort sowie diese ein .
quelle
find . -type d -maxdepth1 -print0 | xargs -0 touch
oder MichaelMrozeks obige Antwort umzusteigen .Sie sollten nicht versuchen, die Ausgabe von zu analysieren
ls
.Außerdem sollten Sie Ihre
"$file"
angeben, um Leerzeichen zu erfassen. Siehe http://www.grymoire.com/Unix/Quote.htmlSo etwas könnte das erreichen, wonach Sie streben:
Weitere Informationen finden Sie in den ersten beiden Bash-Fallstricken .
quelle
touch ./*
sollte in den meisten Fällen funktionieren. Diefor
Schleife ist wirklich nicht erforderlich , datouch
sie mehrere Dateien aufnehmen kann und Sie./
Dateien mit Namen wie--help
richtig behandeln müssen. Dies ist eine gute Ressource zu diesem Thema.*
keine Dateien und Verzeichnisse erfasst werden, deren Name mit einem Punkt beginnt. Eine Möglichkeit, dies zu beheben, besteht darin, diedotglob
Shell-Option über zu aktivierenshopt -s dotglob
.quelle