Usiłuję zaktualizować znaczniki czasu wszystkich folderów w cwd przy użyciu tego:
for file in `ls`; do touch $file; done
Ale to nie działa. Jakieś pomysły dlaczego?
Usiłuję zaktualizować znaczniki czasu wszystkich folderów w cwd przy użyciu tego:
for file in `ls`; do touch $file; done
Ale to nie działa. Jakieś pomysły dlaczego?
Odpowiedzi:
Wszystkie dotychczasowe odpowiedzi (jak również przykład w pytaniu) zakładają, że chcesz touch
wszystko w katalogu, nawet jeśli powiedziałeś „dotknij wszystkich folderów”. Jeśli okaże się, że katalog zawiera pliki i foldery, a chcesz tylko zaktualizować foldery, możesz użyć find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Lub jeśli Twoja find
implementacja nie obsługuje niestandardowych -mindepth
/ -maxdepth
predykatów:
$ find . ! -name . -prune -type d -exec touch {} +
To:
$ touch -c -- */
Powinien działać w większości powłok, z wyjątkiem tego, że:
touch
symlinkował do katalogów*
w muszli innych niż csh
, tcsh
, zsh
, fish
lub Thompson shell (co byłoby zgłosić błąd zamiast). W tym przypadku używamy -c
do obejścia tego problemu, chociaż nadal może to być touch
plik spoza katalogu o nazwie *
.Z zsh
, touch
tylko do katalogów, w tym ukrytych:
touch -- *(D/)
{} \+
to specjalna find
składnia - czytaj stronę podręcznika, aby uzyskać więcej. Myślę, że touch -c ./*/
to też zadziała.
-maxdepth 1
do polecenia, aby find
nie powracało do podfolderów. Wydaje się, że OP chce dotykać tylko tych folderów w cwd, a nie podfolderów.
Próbować
touch ./*
Unika niepotrzebnej for
pętli, która odradzałaby nowy proces dla każdego pliku i działa dla wszystkich nazw plików, nawet tych ze spacjami lub tych, które wyglądają jak opcje (jak -t
). Jedyny raz to nie zadziała, jeśli nie masz plików (bez kropek) w katalogu, w którym to przypadku utworzysz plik o nazwie *
. Aby tego uniknąć, w konkretnym przypadku touch
większość implementacji ma -c
opcję (wywoływaną również --no-create
w wersjach GNU), aby nie tworzyć nieistniejących plików, tj.
touch -c ./*
Zobacz także dobre referencje w odpowiedzi jasonwryan jest jak ten jeden .
Nie powinieneś próbować analizować danych wyjściowychls
.
Powinieneś również zacytować swoje, "$file"
aby uchwycić dowolne białe znaki. Zobacz http://www.grymoire.com/Unix/Quote.html
Coś takiego może osiągnąć to, czego szukasz:
for file in *; do touch "$file"; done
Zobacz dwa pierwsze pułapki Bash, aby uzyskać dokładniejsze wyjaśnienie.
*
nie przechwytuje plików i katalogów, których nazwa zaczyna się od kropki. Jednym ze sposobów rozwiązania tego problemu jest włączenie dotglob
opcji powłoki za pośrednictwem shopt -s dotglob
.