bir dizindeki tüm klasörlere dokunun


14

Bunu kullanarak cwd tüm klasörlerin zaman damgalarını güncelleştirmeye çalışıyorum:

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

Ama işe yaramıyor gibi görünüyor. Neden herhangi bir fikir?

Yanıtlar:


21

Şimdiye kadar olan tüm yanıtlar (ve sorudaki örneğiniz gibi) touch, "tüm klasörlere dokunun" demiş olsanız bile, dizindeki her şeyi istediğinizi varsayar . Dizinin dosya ve klasör içerdiği ortaya çıkarsa ve yalnızca klasörleri güncellemek istiyorsanız şunları kullanabilirsiniz find:

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

Veya finduygulamanız standart dışı -mindepth/ -maxdepthtahminleri desteklemiyorsa:

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

Bu:

$ touch -c -- */

Bunun dışında çoğu kabukta çalışmalıdır:

  • aynı zamanda düz dizinlere ek olarak touch dizinlerle de bağlantı kuracaktır
  • gizli olanları atlayacak
  • dizinine bir dizin veya sembolik bağı varsa, bu adlı bir dosya yaratacak *dışındaki kabuklarda csh, tcsh, zsh, fishveya (yerine bir hata rapor verecek) Thompson kabuğu. Burada, bunun -cetrafında çalışmak için kullanıyoruz , ancak yine de adlı touchbir dizin olmayan dosya olabilir *.

İle zshe touchdizinlere sadece, gizli olanlar dahil:

touch -- *(D/)

'{} \ +' Ne hakkında?
javamonkey79

3
{} \+Özel findsözdizimi - daha man sayfalarını okumalı. Bence touch -c ./*/de işe yarayacaktır.
jw013

2
-maxdepth 1Komuta eklemeniz gerekir , böylece findalt klasörlere geri dönmez. OP, alt klasörlere değil, yalnızca cwd'deki klasörlere dokunmak istiyor gibi görünüyor.
Steven Pazartesi

1
@ jw013 Diğer insanların cevaplarına iyi fikirler eklemeye devam edersiniz :)
Michael Mrozek

+ Karakterinden neden kaçasın? Onu yorumlayan mermiler var mı?
Witiko

11

Deneyin

touch ./*

Her fordosya için yeni bir işlem oluşturacak gereksiz döngüden kaçınır ve boşluklu veya seçenek gibi görünen tüm dosya adları için çalışır (örneğin -t). Çalışmayacağı tek zaman dizinde (nokta olmayan) dosya yoksa, bu durumda adında bir dosya oluşturursunuz *. Bundan kaçınmak için, touchçoğu uygulamada belirli bir durumda -c( --no-createGNU sürümlerinde de denir ) varolmayan dosyalar oluşturma seçeneği vardır, yani

touch -c ./*

Ayrıca iyi referanslara bakınız jasonwryan cevabı yanı sıra bu bir .


1
Cwd'de 1 milyon klasör varsa ne olur?
Steven Pazartesi

Eğer "argüman listesi çok uzun" tip problemlerle karşılaşırsanız, muhtemelen "daha ağır" araçlara find . -type d -maxdepth1 -print0 | xargs -0 touchveya MichaelMrozek'in yukarıdaki cevabına geçmek en iyisidir .
jw013

7

Sen çıktısını ayrıştırmak için çalışmamalıdırls .

Ayrıca, "$file"herhangi bir boşluk yakalamak için teklif gerekir . Bkz. Http://www.grymoire.com/Unix/Quote.html

Böyle bir şey peşinde olduğunuz şeyi başarabilir:

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

Daha ayrıntılı bir açıklama için ilk iki Bash Tuzağına bakın.


2
Kapat ama tam olarak değil. A touch ./*çoğu durumda çalışmalıdır. Döngüye gerçekten gerek yoktur, forçünkü touchbirden fazla dosya alabilir ve ./dosyaları --helpdüzgün bir şekilde adlarla işlemeniz gerekir. Bu konuda iyi bir kaynaktır .
jw013

'*' Neden çalışır?
javamonkey79

@ javamonkey79 It kabuğu globbing .
jw013

1
@ jw013 Mükemmel nokta: ve tekerlekli bağlantı için teşekkür ederim.
jasonwryan

*Adının bir nokta ile başlayan dosyaları ve dizinleri yakalamadığını unutmayın . Bunu düzeltmenin bir yolu da dotglobkabuk seçeneğini etkinleştirmektir shopt -s dotglob.
Witiko

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.