Я пытаюсь обновить метки времени всех папок в 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, а не подпапок.Пытаться
Это позволяет избежать ненужного
for
цикла, который порождает новый процесс для каждого отдельного файла, и работает для всех имен файлов, даже с именами с пробелами или с похожими параметрами-t
. Единственный раз, когда это не сработает, это если у вас нет (не точечных) файлов в каталоге, и в этом случае вы в конечном итоге создадите файл с именем*
. Чтобы избежать этого, в конкретном случаеtouch
большинства реализаций есть-c
опция (также называемая--no-create
в версиях GNU), чтобы не создавать несуществующие файлы, т.е.Смотрите также ссылки хорошие в ответ jasonwryan в так же как это одно .
источник
find . -type d -maxdepth1 -print0 | xargs -0 touch
, или ответ MichaelMrozek выше.Вы не должны пытаться анализировать вывод
ls
.Кроме того, вы должны указать свои,
"$file"
чтобы захватить любые пробелы. См. Http://www.grymoire.com/Unix/Quote.html.Нечто подобное может достичь того, что вы ищете:
Посмотрите первые две ловушки Bash для более подробного объяснения.
источник
touch ./*
должно работать в большинстве случаев.for
Цикл действительно не нужен, поскольку онtouch
может принимать несколько файлов, и вам нужно./
обрабатывать файлы с такими именами, как нужно--help
. Это хороший ресурс на эту тему.*
не захватывает файлы и каталоги, чье имя начинается с точки. Один из способов исправить это - включитьdotglob
опцию оболочки черезshopt -s dotglob
.источник