Я пытаюсь обновить метки времени всех папок в cwd, используя это:
for file in `ls`; do touch $file; done
Но это не похоже на работу. Есть идеи почему?
Я пытаюсь обновить метки времени всех папок в cwd, используя это:
for file in `ls`; do touch $file; done
Но это не похоже на работу. Есть идеи почему?
Ответы:
Все ответы на данный момент (а также ваш пример в вопросе) предполагают, что вы хотите touch
все в каталоге, даже если вы сказали «дотронуться до всех папок». Если оказывается, что каталог содержит файлы и папки, и вы хотите обновить только папки, вы можете использовать find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Или , если ваша find
реализация не поддерживает нестандартные -mindepth
/ -maxdepth
предикаты:
$ find . ! -name . -prune -type d -exec touch {} +
Эта:
$ touch -c -- */
Должен работать в большинстве оболочек, за исключением того, что:
touch
символические ссылки на каталоги в дополнение к простым каталогам*
отличными от снарядов csh
, tcsh
, zsh
, fish
или Thompson оболочка (которая будет сообщать об ошибке , а). Здесь мы используем, -c
чтобы обойти это, хотя это может все еще touch
называться не каталогом файла *
.С zsh
, в touch
каталоги только, в том числе скрытых из них:
touch -- *(D/)
{} \+
специальный find
синтаксис - читайте справочную страницу для получения дополнительной информации. Я думаю, что touch -c ./*/
будет работать так же.
-maxdepth 1
в команду, чтобы find
не переходить в подпапки. OP, кажется, хочет коснуться только тех папок в cwd, а не подпапок.
Пытаться
touch ./*
Это позволяет избежать ненужного for
цикла, который порождает новый процесс для каждого отдельного файла, и работает для всех имен файлов, даже с именами с пробелами или с похожими параметрами -t
. Единственный раз, когда это не сработает, это если у вас нет (не точечных) файлов в каталоге, и в этом случае вы в конечном итоге создадите файл с именем *
. Чтобы избежать этого, в конкретном случае touch
большинства реализаций есть -c
опция (также называемая --no-create
в версиях GNU), чтобы не создавать несуществующие файлы, т.е.
touch -c ./*
Смотрите также ссылки хорошие в ответ jasonwryan в так же как это одно .
Вы не должны пытаться анализировать выводls
.
Кроме того, вы должны указать свои, "$file"
чтобы захватить любые пробелы. См. Http://www.grymoire.com/Unix/Quote.html.
Нечто подобное может достичь того, что вы ищете:
for file in *; do touch "$file"; done
Посмотрите первые две ловушки Bash для более подробного объяснения.
*
не захватывает файлы и каталоги, чье имя начинается с точки. Один из способов исправить это - включить dotglob
опцию оболочки через shopt -s dotglob
.