Я намагаюся оновити часові позначки всіх папок у 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вона не повторювалася в підпапки. ОП, схоже, хоче торкнутися лише тих папок у 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
Дивіться перші два підводні камені Баша для більш ретельного пояснення.
*не зберігаються файли та каталоги, ім'я яких починається з крапки. Один із способів виправити це - включити параметр dotglobоболонки через shopt -s dotglob.
for file in `find .`; do touch $file; done