коснитесь всех папок в каталоге

Существует проект диспетчера пакетов - Отклоняют - с интересной основополагающей идеей ("функциональный" pkg менеджер), который также поддерживает операцию в расчете на пользователя:

Многопользовательская поддержка

При запуске в версии 0.11 Отклоните, имеет многопользовательскую поддержку. Это означает, что непривилегированные пользователи могут надежно установить программное обеспечение. У каждого пользователя может быть различный профиль, ряд пакетов в Отклонить хранилище, которые появляются в ПУТИ пользователя. Если пользователь установит пакет, который другой пользователь уже установил ранее, то пакет не будет создан или загрузил во второй раз. В то же время для одного пользователя не возможно ввести Троянского коня в пакет, который мог бы использоваться другим пользователем.

ПРИМЕЧАНИЕ Я ХОЧУ ДОБАВИТЬ: Nix должно быть применимым в подобной Unix системе по Вашему выбору (например, дистрибутив Linux).

Существует также связанное большое количество пакетов, которые могут быть установлены с Отклонить диспетчером пакетов - Nixpkgs - созданный для многих платформ:

  • GNU/Linux на 32-разрядном и 64-разрядном x86 (i686-linux и x86_64-linux)
  • Mac OS X (i686-darwin и x86_64-darwin)
  • FreeBSD (i686-freebsd и x86_64-freebsd)
  • OpenBSD (i686-openbsd)
  • Windows / Cygwin (i686-cygwin),

и связанный дистрибутив - NixOS:

NixOS является дистрибутивом Linux на основе, Отклоняют. Это использует, Отклоняют не только для управления пакетом, но также и управлять конфигурацией системы (например, в файлы конфигурации сборки в / и т.д.). Это означает, среди прочего, что возможно легко откатывать всю конфигурацию системы к более раннему состоянию. Кроме того, пользователи могут установить программное обеспечение без полномочий пользователя root. Считайте больше …

и связанная "непрерывная" система сборки - Гидра.

13
16.01.2014, 20:26
5 ответов

Все ответы до сих пор (а также Ваш пример в вопросе) предполагают, что Вы хотите 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/)
21
27.01.2020, 19:52
  • 1
    О чем '{} \+'? –  javamonkey79 08.10.2011, 04:25
  • 2
    {} \+ является особенным find синтаксис - прочитал страницу справочника для больше. Я думаю touch -c ./*/ работал бы также. –  jw013 08.10.2011, 05:12
  • 3
    Необходимо включать -maxdepth 1 к команде, так, чтобы find не рекурсивно вызывает в подпапки. OP, кажется, хочет коснуться только тех папок в cwd, не подпапок. –  Steven Monday 08.10.2011, 05:53
  • 4
    @jw013 Это было бы - Вы продолжаете присоединять хорошие идеи :) –  Michael Mrozek♦ 08.10.2011, 07:22
  • 5
    , Почему Вы выйдете + символ? Есть ли оболочки, которые интерпретируют его? –  Witiko 30.08.2016, 18:43

Попробовать

touch ./*

Это избегает ненужного for цикл, который породил бы новый процесс для каждого файла и работы для всех имен файлов, даже с пробелами или, которые похожи на опции (как -t). Единственное время это не работало бы, - то, если бы у Вас нет (неточечных) файлов в каталоге, в этом случае, Вы закончили бы тем, что создали названный файл *. Избегать что, для конкретного случая touch большинство реализаций имеет a -c опция (также названный --no-create в версиях GNU) для не создания несуществующих файлов, т.е.

touch -c ./*

См. также хорошие ссылки в ответе jasonwryan, а также этом.

11
27.01.2020, 19:52
  • 1
    Что произойдет, если у Вас будет 1 миллион папок в cwd? –  Steven Monday 08.10.2011, 05:54
  • 2
    При столкновении "со списком аргументов слишком долго", проблемы типа, вероятно, лучше переключиться на "более тяжелые" инструменты как find . -type d -maxdepth1 -print0 | xargs -0 touch, или ответ MichaelMrozek выше. –  jw013 08.10.2011, 06:02

Вы не должны пытаться проанализировать вывод ls.

Кроме того, необходимо заключить Ваш в кавычки "$file" получать любой пробел. См. http://www.grymoire.com/Unix/Quote.html

Что-то вроде этого могло бы достигнуть того, что Вы после:

for file in *; do touch "$file"; done

Посмотрите первые две Ловушки Bash для более полного объяснения.

7
27.01.2020, 19:52
  • 1
    Близко, но не совсем. A touch ./* должен работать в большинстве случаев. Действительно нет никакой потребности в for цикл с тех пор touch может взять несколько файлов, и Вам нужно ./ обработать файлы с именами как --help правильно. Это - хороший ресурс на предмете. –  jw013 08.10.2011, 03:32
  • 2
    Почему делает '*' работа? –  javamonkey79 08.10.2011, 03:33
  • 3
    @javamonkey79 Это - оболочка globbing. точное замечание –  jw013 08.10.2011, 03:35
  • 4
    @jw013: и спасибо за ссылку wheeler. упаковщикам –  jasonwryan 08.10.2011, 03:48
  • 5
    Отметьте это * не получает файлы и каталоги, имя которых начинается с точки. Один способ зафиксировать, который должен включить dotglob опция оболочки через shopt -s dotglob. –  Witiko 30.08.2016, 18:49
for file in `find .`; do touch $file; done
-1
27.01.2020, 19:52

На всякий случай, если вы хотите обновить временные метки для всех файлов/каталогов, происходящих из этого каталога, попробуйте либо (обратите внимание, что моя находка здесь ниже является псевдонимом того, что некоторые системы называют gfind, т. е. gnu-версия find ).

 find./ -exec touch -am '{}' \;

Или, более эффективно,

 for f in **; do touch -am $f; done 

-am означает обновление как для доступа, так и для модификации. Обратите внимание, что вы, вероятно, не можете просто выполнить touch -am **, так как вы не можете запустить exec в списке, превышающем getconf ARG _MAX

0
04.08.2020, 00:27

Теги

Похожие вопросы