Jaka jest różnica między plikiem dotykowym a> plikiem?

17

Jestem rodzaju newbie na Linuksa, i zastanawiam się, czy nie >i touchmieć ten sam efekt. Mam na myśli, czy następujące dwa polecenia mają taki sam efekt ?:

$ > file.txt

$ touch file.txt

Jeśli tak, dobrze byłoby wiedzieć, że mogę po prostu wpisać `> file.txt ', aby utworzyć nowe pliki.

lmiguelvargasf
źródło
5
Jeśli file.txtjuż istnieje i nie jest pusty, na pewno nie.
fkraiem 30.09.16
1
@fkraiem, czy mógłbyś podać szczegółową odpowiedź?
lmiguelvargasf
4
Mówi, że jeśli touchplik zawiera dane, nic się nie wydarzy, ale jeśli >plik zostanie usunięty.
WinEunuuchs2Unix 30.09.16
Mam to. Dziękuję bardzo za to wyjaśnienie @ WinEunuuchs2Unix
lmiguelvargasf 30.09.16
Czy chcesz odpowiedzieć na pytanie, czy mogę odpowiedzieć na pytanie, czy @fkraiem odpowiedzieć na to pytanie, czy je usunąć?
WinEunuuchs2Unix 30.09.16

Odpowiedzi:

24

Zarówno touchi >utworzy nowy plik, jeśli nie istnieje. Ponieważ poniższe polecenia terminala pokazują, kiedy touchplik istnieje, czas dostępu / ostatniej modyfikacji jest aktualizowany. Ale jeśli masz >istniejący plik, jest on obcinany, a czas ostatniej modyfikacji jest aktualizowany (czas dostępu nie jest). Pamiętaj, że >nie usuwa / nie rozłącza pliku. Iwęzeł pozostaje taka sama - dlatego >/ lub truncatesą powszechnie stosowane, aby wyczyścić z plików dziennika nawet z otwartym uchwytu pliku.

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

Jak wspomniano w komentarzach, touchjest to polecenie zewnętrzne i działa tylko na plikach. >jest wbudowaną funkcją powłoki, która służy do wielu różnych celów. Zazwyczaj zobaczysz, że jest używany cat source.fil > target.fil.

Długi formularz do opróżnienia pliku to:

cat /dev/null > emptyme.fil

Używanie pozwala > emptme.filosiągnąć to samo w kompaktowym formacie bez przekierowywania do pliku.

WinEunuuchs2Unix
źródło
Przypadek użycia: > file.txtjest dobry do czyszczenia plików dziennika.
Rinzwind 30.09.16
8
To nie jest tak naprawdę odtworzone. Istniejący plik jest obcinany, co różni się od odłączenia starego pliku i utworzenia nowego. Największą zauważalną różnicą jest to, że jeśli proces nadal ma stary plik otwarty lub zmapowany, nadal by istniał. Ale obcięcie wpłynęłoby na plik otwarty przez inne procesy.
Peter Cordes
1
Nie jestem pewien co do „największej możliwej do zaobserwowania” - łatwo jest zauważyć, czy dowiązania twarde są zepsute (jeśli ty ln foo bar, a następnie usuń i ponownie utworzysz foo, barnadal masz wcześniejszą zawartość).
Charles Duffy,
1
O tak, to jeszcze łatwiej dostrzegalna różnica. Powinienem był o tym pomyśleć: P
Peter Cordes
@ Charles-Duffy Pewnie, że są 2 linki do fie, co wydaje się oczywiste, ale nie ma to nic wspólnego z tym, co mówił Peter Cordes. Po usunięciu / odłączeniu pliku, który jest aktualnie używany / ma otwarty uchwyt pliku, nie jest usuwany. na przykład powiedz, że rm /var/log/nginx/access.loggdy nginx miał otwarty plik, miałby 0 linków, ale i-węzeł nadal istniałby. lsof -c nginx | grep access.lognastępnie z pid ls -l /proc/<pid>/fd/ | grep access.logi wreszcie cat / proc / <pid> / fd / <nazwa pliku z poprzedniego polecenia> `. Komentowanie, nawet jeśli jest stare. Mam nadzieję, że to miało sens
skrewler
14

Między nimi jest zasadnicza różnica. Touchto polecenie używane do oznaczania pliku czasem. >Symbol jest standardowym redirector wyjście.

Zastosowanie dwóch wyjaśnionych

Wykorzystanie dotyku

Jeśli plik nie istnieje, utworzy go.

Dotyk jest powszechnie używany do tworzenia flag. Na przykład, jeśli chcesz znaleźć wszystkie pliki w systemie dwa razy, możesz użyć następującej sekwencji poleceń:

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

Spowoduje to utworzenie następujących plików (lub zmianę znacznika czasu, jeśli istnieją):

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

Teraz możesz użyć find do wyświetlenia lub przetworzenia wszystkich plików, które zostały zmodyfikowane w tej godzinie (czas między znacznikami czasu tych dwóch plików, tj. Między 22:00 a 23:00 29 września 2016 r.).

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

To jest częściowy wynik powyższego polecenia find:

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]
-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

Zastosowanie przekierowania danych wyjściowych

Symbol przekierowania przekieruje standardowe wyjście do określonego pliku. W zależności od ustawień clobber / noclobber, jeśli może się nie powieść. Noclobber utworzy plik tylko wtedy, gdy nie istnieje.

Istnieje wiele wersji danych wyjściowych przekierowania, które obejmują:

> - Przekieruj standardowe wyjście. Utwórz lub zastąp istniejący plik.
>> - Dołącz przekierowanie. Utwórz lub dołącz do istniejącego pliku.
> & - Przekieruj zarówno standardowe wyjście, jak i standardowy błąd.
>> & - Przekieruj / Dołącz zarówno standardowe wyjście, jak i standardowy błąd

Możemy użyć findpowyższego polecenia, aby przekierować zawartość wszystkich plików utworzonych w ciągu określonej godziny do pliku, który możemy zarejestrować i zbadać później:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
LD James
źródło
Wiele osób wspomniało, że jeśli file.txtistnieje i nie jest puste, to > file.txtwyczyści jego zawartość, ale touch file.txtnie zrobi tego. Ale nikt nie wspominał, że >> file.txtjest to dobry zamiennik touch file.txt- utworzy plik, jeśli nie istnieje (zakładając, że masz na to pozwolenie), ale nie skróci istniejącego pliku. Zobacz Jaka jest różnica między „>” a „>>”?
G-Man mówi „Przywróć Monikę”
Jest to wyjaśnione w sekcji Usage of Output redirection. Zauważ, że mówi >>= Redirect append>.
LD James,
Tak, i to jest całkowicie jasne - dla ludzi, którzy już to znają. Postaw się w sytuacji PO - opublikowałeś ścianę tekstu, która jest zbyt długa, zbyt przeczytana ; z twojej odpowiedzi nie zrozumie, że >> file.txtjest to praktyczny substytut touch file.txt. (Fakt, że jesteś jedyną osobą, która >> w ogóle wspomniała, dlatego zamieściłem mój komentarz pod twoją odpowiedzią, a nie pod pytaniem.)
G-Man mówi „Przywróć Monikę”
1
@ G-Man Niektórzy ludzie mylą symbol przekierowania jako substytut dotyku. Nie jest to jednak substytut. Szczegółami mojej odpowiedzi jest wyjaśnienie tego błędu. Przykładami użycia obu jest pomoc w wyjaśnieniu tego. Zauważ, że pierwsza para odpowiada na początkowe szczegóły twojego obecnego komentarza. Mówi, że istnieje między nimi znacząca różnica. PO jest zainteresowany różnicą. Zatem pozostałe części odpowiedzi to odpowiedź na zainteresowanie PO tymi dwoma. Istnieją różne efekty i istnieją przyczyny tej różnicy.
LD James,
9

>jest operatorem przekierowania wyjścia powłoki używanym do przekierowania STDOUT poprzednich poleceń do deskryptora pliku wymienionego później >. Jeśli plik jest obecny, jego zawartość zostanie obcięta, jako plik open(2)z O_TRUNCflagą -ed z flagą, a jeśli plik nie istnieje, zostanie utworzony.

Należy zauważyć, że ten operator przekierowania będzie obsługiwany przez powłokę przed uruchomieniem poprzedniego polecenia, więc nie zależy to od żadnego polecenia i jest obsługiwany przez samą powłokę.

Zauważ, że niektóre powłoki (np zsh) będzie zachowywać się inaczej z pustym przekierowania jak:

 >file.txt

Typowym rozwiązaniem jest dodanie :( true) polecenia no-op:

 : >file.txt

Tradycyjnie głównym celem touchjest zmiana znacznika czasu pliku, a nie tworzenie pliku.

touchtworzy plik tylko wtedy, gdy plik (i) wymienione w argumencie nie istnieje, w przeciwnym razie zmienia czas modyfikacji pliku na bieżący znacznik czasu. Możesz także zmienić czas dostępu i czas tworzenia i-węzła za pomocą touch.

heemayl
źródło
zshobsługuje puste przekierowanie - działa podobnie jak przekierowanie catbez argumentów do pliku. Zasadniczo wszystko, co wpiszesz, zostanie zapisane w pliku, aż do znaku EOF lub przerwania. To zshzachowanie lustrzane z just <file, który po prostu drukuje zawartość pliku, tak jak catby to zrobił. Mogą być konfigurowalne, widziałem, jak <fileotwieram plik w pager.
8bittree
@ 8bittree Chodzi mi o to, że musisz wprowadzić dane EOF(jak robienie cat >file.txttego, co powiedziałeś), gdzie bashwystarczy samo robienie >file.txt.
heemayl
W porządku, zasugerowałem edycję, która według mnie lepiej wyjaśnia ten pomysł.
8bittree
@ 8bittree Zatwierdzony.
heemayl
(1) Domyślnie touchaktualizuje zarówno czas modyfikacji, jak i czas dostępu do pliku. Istnieją opcje aktualizacji tylko jednego lub drugiego. (2) Unix / Linux / POSIX, ogólnie rzecz biorąc, nie obsługują „czasu tworzenia i-węzła”. Niektóre typy systemów plików obsługują go, ale nie ma uniwersalnego sposobu na obejrzenie go, a co dopiero na modyfikację. Czy możesz podać odniesienie, które mówi, że istnieje wcielenie, touchktóre pozwala użytkownikowi zmienić czas tworzenia i-węzła?
Scott