Touch file ile> file arasındaki fark nedir?


17

Ben tür Linux acemi değilim ve olsun veya olmasın merak >ve touchaynı etkiye sahiptir. Yani, aşağıdaki iki komut aynı etkiye sahip mi ?:

$ > file.txt

$ touch file.txt

Öyleyse, yeni dosyalar oluşturmak için sadece>> file.txt 'yi yazabileceğimi bilmek harika olurdu.


5
Eğer file.txtzaten var ve boş değil, onlar tabii ki yoktur.
fkraiem

1
@fkraiem, lütfen ayrıntılı bir cevap verebilir misiniz?
lmiguelvargasf

4
O eğer söylüyor toucholur veri hiçbirşey içeren bir dosya ama eğer >dosya o silinecektir.
WinEunuuchs2Unix

Anladım. Bu açıklama için çok teşekkür ederim @ WinEunuuchs2Unix
lmiguelvargasf

Soruyu cevaplamak, soruyu cevaplamak, @fkraiem'in cevaplamak veya silmek mi istiyorsunuz?
WinEunuuchs2Unix

Yanıtlar:


24

Hem touchve >o yoksa yeni bir dosya oluşturur. Aşağıdaki terminal komutları touch, varolan bir dosyayı gösterdiğinde erişim / son değiştirilme zamanı güncellenir. Ancak >varolan bir dosyaya kesilirseniz dosya kesilir ve en son değiştirilen saat güncellenir (erişim süresi değişmez). Not >silmez / dosya bağlantısını kaldırmak. Inode aynı kalır - bu nedenle >/ veya truncateaçık bir dosya tanıtıcısıyla bile günlük dosyalarını temizlemek için yaygın olarak kullanılır.

rick@dell:~$ > EmptyFile

rick@dell:~$ touch EmptyFile2

rick@dell:~$ ls Empty*
EmptyFile  EmptyFile2

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ touch EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:32 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

Yorumlarda belirtildiği gibi, touchharici bir komuttur ve sadece dosyalarda çalışır. >birçok farklı amaca hizmet eden bir kabuk yerleşik özelliğidir. Tipik olarak kullanıldığını görürsünüz cat source.fil > target.fil.

Bir dosyayı boşaltmak için uzun bir form:

cat /dev/null > emptyme.fil

Kullanmak > emptme.fil, aynı şeyi dosyaya hiçbir şey yönlendirmeyen kompakt bir formatta gerçekleştirir.


Kullanım örneği: > file.txtgünlük dosyalarını temizlemek için iyidir.
Rinzwind

8
Aslında yeniden yaratılmadı. Varolan dosya kesilir ve eski dosyanın bağlantısını kesip yeni bir dosya oluşturmaktan farklıdır. Gözlemlenebilir en büyük fark, bir işlemde hala eski dosya açık veya eşlenmişse, hala var olacaktır. Ancak kesme işlemi diğer işlemlerin açtığı dosyayı etkiler.
Peter Cordes

1
"Gözlenebilir en büyük" hakkında emin değilim - hardlinklerin kırılıp kırılmadığını gözlemlemek kolaydır (eğer ln foo barsilip yeniden oluşturursanız foo, barönceki içeriğine sahipseniz ).
Charles Duffy

1
Oh evet, bu daha kolay gözlemlenebilir bir fark. Şunu düşünmeliydim: P
Peter Cordes

@ Charles-Duffy Tabii, sanırım bariz bir fie için 2 bağlantı olduğunda, bu Peter Cordes ne söylediğini ile ilgisi yoktur sanırım. Kullanılmakta olan / açık dosya tanıtıcısı olan bir dosyayı sildiğinizde / bağlantısını kaldırdığınızda dosya silinmez. örneğin, rm /var/log/nginx/access.lognginx bu dosyayı açarken 0 bağlantıya sahip olacağını, ancak inode hala mevcut olacağını varsayalım. lsof -c nginx | grep access.logsonra pid ile ls -l /proc/<pid>/fd/ | grep access.logve son olarak önceki komuttan cat / proc / <pid> / fd / <dosyaadı> `. Eski olmasına rağmen yorum yapmak. Umarım mantıklı
skrewler

14

İkisi arasında önemli bir fark var. Touchbir dosyanın zaman damgasını vurmak için kullanılan bir komuttur. >Sembol standart çıkış yönlendiricisi olduğunu.

Açıklanan ikisinin kullanımı

Dokunmatik Kullanımı

Dosya yoksa, dosyayı oluşturur.

Dokunma genellikle bayrak oluşturmak için kullanılır. Örneğin, sisteminizde iki kez arasındaki tüm dosyaları bulmak istiyorsanız, bu komut dizisini kullanabilirsiniz:

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime

Bu, aşağıdaki dosyaları oluşturur (veya varsa zaman damgasını değiştirir):

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime

Artık bulmayı o saatte değiştirilmiş olan tüm dosyaları görüntülemek veya işlemek için kullanabilirsiniz (bu iki dosya zaman damgası arasındaki zaman, yani 29 Eylül 2016, 22:00 - 23:00 arasında).

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n"

Bu, yukarıdaki find komutunun kısmi çıktısıdır:

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/apollothethird@gmail.com.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/address_book_backups/abook.mab.bak
-rw-rw-r-- 09/29 23:00 00 /home/users/l/j/ljames/endtime
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/Temp
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi/1.337.0_0

Çıktı yeniden yönlendirmesinin kullanımı

Yönlendirme Sembolü standart çıktıyı belirtilen dosyaya yönlendirir. Clobber / noclobber ayarlarınıza bağlı olarak başarısız olabilir. Noclobber dosyayı yalnızca yoksa oluşturur.

Yeniden yönlendirme çıktısının aşağıdakileri içeren bir dizi sürümü vardır:

> - Standart çıkışı yeniden yönlendirir. Mevcut dosyayı oluşturun veya üzerine yazın.
>> - Yeniden yönlendirme eki. Varolan dosyayı oluşturun veya ekleyin.
> & - Hem standart çıktıyı hem de standart hatayı yeniden yönlendirin.
>> & - Yönlendirin / Hem standart çıktıyı hem de standart hatayı ekleyin

findYukarıdaki komutumuzu, belirtilen saat içinde oluşturulan tüm dosyaların içeriğini daha sonra günlüğe kaydedip inceleyebileceğimiz bir dosyaya yönlendirmek için kullanabiliriz :

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log

Birçok kişi, eğer file.txtvarsa ve boş değilse, o > file.txtzaman içeriğini temizleyeceğini, ancak touch file.txtolmayacağını belirtti. Ancak kimse >> file.txtbunun iyi bir yedek olduğunu söylemedi touch file.txt- eğer yoksa, dosya oluşturacak (bunu yapma izniniz olduğunu varsayarak), ancak mevcut bir dosyayı kısaltmayacaktır. Bkz. “>” Ve “>>” arasındaki fark nedir?
G-Man

Bu bölümde açıklanmaktadır Usage of Output redirection. Uyarı >>= diyor Redirect append>.
LD James

Evet, bu çok açık - zaten bilen insanlar için. Kendinizi OP'nin yerine koyun - Çok Uzun Çok Okunan bir metin duvarı yayınladınız ; cevabınızdan >> file.txt, bunun uygulanabilir bir ikame olduğunu anlamayacaktır touch file.txt. (Bahsettiğiniz tek insansın aslında >> hiç Doğrusu soruya altında daha Cevabınız altında benim görüş gönderdi nedeni budur.)
G-Man 'eski durumuna Monica' Diyor

1
@ G-Man Bazı insanlar yönlendirme sembolünü dokunmanın yerini alacak şekilde karıştırır. Ancak bunun yerine geçmez. Cevabımın ayrıntıları bu hatayı açıklığa kavuşturmak. İkisini kullanma örnekleri, onu netleştirmeye yardımcı olmaktır. İlk çift satırın, mevcut yorumunuzun ilk ayrıntılarına yanıt verdiğini lütfen unutmayın. İkisi arasında önemli bir fark olduğunu söylüyor. OP farkla ilgileniyor. Bu yüzden cevabın diğer kısımları OP'nin ikisine olan ilgisine cevap vermektir. Farklı efektler var ve farkın nedenleri var.
LD James

9

> önceki komutların STDOUT'unu daha sonra belirtilen dosya tanımlayıcısına yeniden yönlendirmek için kullanılan kabuk çıktı yeniden yönlendirme operatörüdür. > . Dosya varsa, 's içeriği edilmesi ile dosya olarak, kesilecek open(2)olan -ed O_TRUNCbayrak ve dosya mevcut değilse, bu oluşturulacaktır.

Unutulmaması gereken önemli bir nokta, bu yönlendirme operatörünün önceki komut çalıştırılmadan önce kabuk tarafından işleneceğinden, bu herhangi bir komuta bağlı değildir ve kabuğun kendisi tarafından işlenir.

Bazı mermilerin (örn. zsh) Boş yönlendirme ile farklı davranacağına dikkat edin:

 >file.txt

Tipik bir çözüm :( true) no-op komutunu eklemektir :

 : >file.txt

Geleneksel olarak, asıl amacı touchbir dosya oluşturmak yerine bir dosyanın zaman damgasını değiştirmektir.

touchyalnızca bağımsız değişkende belirtilen dosyalar yoksa bir dosya oluşturur, aksi takdirde dosyanın değişiklik zamanını geçerli zaman damgasına değiştirir. Tuşunu kullanarak erişim süresini ve inode oluşturma süresini de değiştirebilirsiniz touch.


zshboş yönlendirmeyi destekler - catbir dosyaya argüman olmadan yeniden yönlendirmeye oldukça benzer şekilde davranır . Temelde yazdığınız her şey bir EOF karakteri veya bir kesinti oluncaya kadar dosyaya yazılır. Bu , dosya içeriğini olduğu gibi basan zshsadece davranışını yansıtır . Bunlar yapılandırılabilir, dosyayı bir çağrı cihazında açık gördüm . <filecat<file
8bittree

@ 8bittree Demek istediğim EOF( sadece cat >file.txtsöylediğin gibi yapmak gibi), bashsadece yapmak >file.txtyeterli yeterli girmek gerekir .
heemayl

Yeterince adil, fikri daha net bir şekilde ele aldığımı düşündüğüm bir düzenleme önerdim.
8bittree

@ 8bittree Onaylandı.
heemayl

(1) Varsayılan olarak, touchdosyanın hem değişiklik süresini hem de erişim süresini günceller. Yalnızca birini veya diğerini güncelleme seçenekleri vardır. (2) Unix / Linux / POSIX genel olarak “inode oluşturma süresini” desteklemez. Bazı dosya sistemi türleri bunu destekler, ancak değiştirmek için evrensel bir yol yoktur. touchKullanıcının inode oluşturma süresini değiştirmesine izin veren bir enkarnasyon olduğunu söyleyen bir referans sağlayabilir misiniz ?
Scott
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.