Я намагаюся оновити часові позначки всіх папок у 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