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 touchwszystko 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 findimplementacja nie obsługuje niestandardowych -mindepth/ -maxdepthpredykató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, fishlub Thompson shell (co byłoby zgłosić błąd zamiast). W tym przypadku używamy -cdo obejścia tego problemu, chociaż nadal może to być touchplik spoza katalogu o nazwie *.Z zsh, touchtylko do katalogów, w tym ukrytych:
touch -- *(D/)
{} \+to specjalna findskładnia - czytaj stronę podręcznika, aby uzyskać więcej. Myślę, że touch -c ./*/to też zadziała.
-maxdepth 1do polecenia, aby findnie 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 forpę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 touchwiększość implementacji ma -copcję (wywoływaną również --no-createw 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 dotglobopcji powłoki za pośrednictwem shopt -s dotglob.