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

Я пытаюсь обновить временные метки всех папок в 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 
Linux и Unix - лучшая ОС в мире.