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

Я пытаюсь обновить временные метки всех папок в cwd, используя это:

for file in `ls`; do touch $file; done 

Но, похоже, это не работает. Любые идеи почему?

4 Solutions collect form web for “коснитесь всех папок в каталоге”

Все ответы до сих пор (а также ваш пример в вопросе) предполагают, что вы хотите touch всего в каталоге, даже если вы сказали «коснитесь всех папок». Если окажется, что каталог содержит файлы и папки, и вы только хотите обновлять папки, вы можете использовать find :

 $ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} + 

Или, если ваша реализация find не поддерживает нестандартные -maxdepth -mindepth / -maxdepth :

 $ find . ! -name . -prune -type d -exec touch {} + 

Эта:

 $ touch -c -- */ 

Должен работать в большинстве оболочек, за исключением:

  • он также touch символических ссылок на каталоги в дополнение к простым каталогам
  • он опустит скрытый
  • если в каталоге нет директории или символической ссылки, он создаст файл с именем * в оболочках, отличных от csh , tcsh , zsh или оболочки Thomson (который будет сообщать об ошибке вместо этого). Здесь мы используем -c чтобы обойти его, чтобы он мог touch файла без каталога, называемого * .

С zsh , touch только каталогов, в том числе скрытых:

 touch -- *(D/) 

Пытаться

 touch ./* 

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

 touch -c ./* 

См. Также хорошие ссылки в ответе Джейсонвреяна, а также этот.

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

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

Что-то вроде этого может добиться того, что вам нужно:

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

См. Первые два Bash Pitfalls для более подробного объяснения.

 for file in `find .`; do touch $file; done 
Interesting Posts

Автоматически разрешать user1 в группе 1 редактировать файл с владельцем user2 и группой user2

Пробелы XMonad в полноэкранном режиме

Имеет ли segfaults плохую память

Как запустить процесс для пользователя, когда он входит в систему и завершается, когда закрывается его последняя сессия?

mkdir с функцией даты ведет себя по-разному в скрипте

Ошибка ввода-вывода для члена RAID5. Что делать с плохими блоками?

Могу ли я запустить команду после того, как пользователь использует Ctrl-C, чтобы убить команду?

Предотвратите пробуждение оптического дисковода (с шумом) после приостановки и при запуске

bash: Отмена выполнения «обработчика ловушек DEBUG»

Почему временные метки на моем съемном носителе считаются временем UTC?

Как получить сервис, который гарантирует, что программа будет работать?

Конфигурация Linux VPS

добавление PATH для кучи программ

umount / home не работает

Как заменить новую строку на sed?

Linux и Unix - лучшая ОС в мире.