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?
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 specjalnafind
składnia - czytaj stronę podręcznika, aby uzyskać więcej. Myślę, żetouch -c ./*/
to też zadziała.-maxdepth 1
do polecenia, abyfind
nie powracało do podfolderów. Wydaje się, że OP chce dotykać tylko tych folderów w cwd, a nie podfolderów.Próbować
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 przypadkutouch
większość implementacji ma-c
opcję (wywoływaną również--no-create
w wersjach GNU), aby nie tworzyć nieistniejących plików, tj.Zobacz także dobre referencje w odpowiedzi jasonwryan jest jak ten jeden .
źródło
find . -type d -maxdepth1 -print0 | xargs -0 touch
lub odpowiedź Michaela Mrożka powyżej.Nie powinieneś próbować analizować danych wyjściowych
ls
.Powinieneś również zacytować swoje,
"$file"
aby uchwycić dowolne białe znaki. Zobacz http://www.grymoire.com/Unix/Quote.htmlCoś takiego może osiągnąć to, czego szukasz:
Zobacz dwa pierwsze pułapki Bash, aby uzyskać dokładniejsze wyjaśnienie.
źródło
touch ./*
powinno działać w większości przypadków.for
Pętla nie jest tak naprawdę potrzebna, ponieważtouch
może zająć wiele plików, a Ty musisz odpowiednio./
obsługiwać pliki o nazwach--help
. To dobry zasób na ten temat.*
nie przechwytuje plików i katalogów, których nazwa zaczyna się od kropki. Jednym ze sposobów rozwiązania tego problemu jest włączeniedotglob
opcji powłoki za pośrednictwemshopt -s dotglob
.źródło