Jakie są uzasadnione zastosowania polecenia „touch”?


83

Jaki jest sens touchpolecenia? Wiem, że mogę tworzyć przy nim puste pliki, ale tak też jest w przypadku echo -n.

W przeciwnym razie, dlaczego ktoś musiałby zmieniać znaczniki czasu pliku? O ile nie stworzy fałszywego wrażenia na temat wieku pliku, nie widzę żadnego innego zastosowania, a ten nie jest uzasadniony (z mojego punktu widzenia).


15
zamiast echo -n > filenamemożna uruchomić następujące polecenia:>filename
AMADANON Inc.

77
Jakie są nielegalne zastosowania?
bmargulies

10
Unless to create the false impression about the age of a file. Niepotrzebne fałszywe wrażenie. Co jeśli chcesz zmienić czas modyfikacji? Może być przydatny w skryptach. Ten skrypt w dużej mierze zależy od touchpolecenia i jest bardzo wygodny i prosty.
VL-80

7
Zastanów się, co robią tar(lub inne programy dezarchiwizujące) po rozpakowaniu archiwum. Zasadniczo ustawiają czas modyfikacji pliku na czas z archiwum, a nie na czas wyodrębnienia archiwum, a jest to pożądana funkcja. Ponieważ jest dozwolone, aby program działający w trybie użytkownika tworzył fałszywe znaczniki czasu, nie ma wiele argumentów, dlaczego touch(lub jakiś inny program wiersza poleceń) nie powinien na to pozwalać na podstawie argumentu wiersza poleceń. Uczenie się C nie czyni cię bardziej uzasadnionym niż ktoś, kto pisze shscenariusz ;-)
Steve Jessop

5
W unixie nie ma znacznika czasu opisującego ageplik. Byłby to creationznacznik czasu i nie ma takiego znacznika czasu dla plików w Uniksie.
Kevin Fegan

Odpowiedzi:


98

Jedną z zalet touchjest to, że może określać dowolne znaczniki czasu, a echo -nzawsze będzie skutkować bieżącym czasem.

Przykładem uzasadnionego użycia jest aktualizacja sygnatury czasowej pliku kodu źródłowego, aby podobny program makeuznał plik źródłowy za nowszy niż skompilowany obiekt i go odbudował.

Inne zastosowania to tworzenie plików, które działają wyłącznie na podstawie ich istnienia, np. /etc/nologinCo uniemożliwia logowanie, jeśli istnieje. Twierdziłbym również, że touch myfilejest to prostsza konstrukcja niż echo -n >> myfilekrótsza pisanie.


18
inne powszechne zastosowanie: dotknij pliku do określonej daty, a następnie „znajdź / -numer / plik /”, aby znaleźć wszystkie pliki zmienione / utworzone po nim
Olivier Dulac

@ casey Kiedy sprawdziłem dokumentację echo -n, widzę, że jest napisane: „nie wypisuj końcowego nowego wiersza”. Więc nie widzę, jak to może stworzyć pusty plik. Czy możesz to wyjaśnić?
Geek

3
@Geek echo -nwyświetli pusty ciąg i sam w sobie nic nie robi. Przekierowanie wyjścia za pomocą >>powoduje dołączenie pustego wyjścia do pliku. Przekierowanie spowoduje utworzenie pliku, jeśli plik nie istnieje.
Casey

6
To nie działa: otwarcie istniejącego pliku do wyjścia, ale nie zapisywanie go, nie zmienia mtime (w moim systemie, zresztą). Nawet jeśli tak, nie potrzebujesz i nie powinieneś używać echo -npolecenia, które nic nie robi. echo -nmoże wypisywać ciąg „-n” pod niektórymi powłokami. Jeśli naprawdę potrzebujesz polecenia, które nic nie robi :lub truejest lepszą opcją, ale >> myfilesamo w sobie jest również doskonale poprawnym sposobem tworzenia pliku, jeśli nie istnieje. Wszystko to oczywiście wspiera twoją odpowiedź, że powinieneś po prostu użyć „dotyku”.
hvd

40

Podstawowe wywołanie systemowe ( utime) jest ważne dla różnych narzędzi, takich jak tarmożliwość ustawiania znaczników czasu dla nowo skopiowanego (nie-tarowanego) pliku. Niektóre narzędzia do tworzenia kopii zapasowych mogą być również dostępne w celu zresetowania czasu ostatniego dostępu do plików, które skopiowały.

Jednym z uzasadnionych zastosowań touchjest utworzenie pliku z określonym znacznikiem czasu. Taki plik „odniesienia” może być następnie używany przez takie polecenia find. Na przykład, aby znaleźć wszystkie pliki zmodyfikowane ostatnio niż 1 listopada 2013 r. (Tj. 2013/11/01) „

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +

Jak obliczyć, że 201311010000 to oznacza 1 listopada 2013 r.? Czy istnieje narzędzie, które mi to powie? Innymi słowy, jak określić dane wejściowe do dotknięcia?
Geek

4
@Geek Patrząc na numer i zauważając, że pierwszą część 20131101można podzielić na 2013-11-011 listopada 2013 r. Możesz następnie założyć, że 0000część wskazuje konkretną porę dnia, w tym przypadku 00 godzin, 00 minut. Lub możesz po prostu spojrzeć na stronę podręcznika użytkownika touch, która mówi dokładnie, jaki jest format (patrz -t).
JAB

@Geek Strony są twoim przyjacielem :-)
JRFerguson

39

Przez touchdowództwa podstawowym celem jest manipulowanie znaczniki czasu plików i tworzenia plików.

Przykłady

1. tworzenie plików

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3

UWAGA: Dane total 0wyjściowe ls -lsą prawidłowe. Ta implementacja lspokazuje liczbę bloków używanych przez pliki na liście. Możesz się tego upewnić, dodając -sprzełącznik do ls. Spowoduje to wyświetlenie bloków używanych przez każdy plik. Tutaj dodałem 2 znaki do pliku 1 i pliku 2.

Przykład

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3

2. informacje o czasie / dacie pliku - polecenie stat

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -

Możemy użyć touchdo manipulowania różnymi znacznikami czasu w danym pliku.

3. fragment strony podręcznika dotykowego

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

4. manipulowanie czasem dostępu

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -

5. manipulować modyfikować czas

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -

Być może zastanawiasz się nad czasem zmiany (ctime). Za pomocą których nie można manipulować touch. Śledzi to czas, w którym dowolny z metadanych został dotknięty w pliku. Zobacz pytania i odpowiedzi dotyczące U&L, aby uzyskać więcej informacji, zatytułowane: Co możesz zrobić z plikiem bez uruchamiania znacznika czasu „Zmień”? .


@sim: moje pytanie sugeruje, że wiem, że dotyk służy do zmiany znaczników czasu. Chciałem tylko wiedzieć, dlaczego tak uczciwy użytkownik tego chce. Gdyby nie twoja odpowiedź na ctime, dałbym ci -1.
Quora Feans

16
@QuoraFea - moja odpowiedź jest dla twojej korzyści i dla każdego użytkownika, który kiedykolwiek ją spotka w przyszłości. Proszę nie zakładać, że odpowiedź jest wyłącznie dla was i przepraszam, że w jakikolwiek sposób was uraziłem, to nie było moim zamiarem, starałem się jedynie wyjaśnić podstawy działania czasu.
slm

@sim: Nie jestem obrażony, pomyślałem, że odpowiedź nie idzie w dobrym kierunku. W każdym razie dzięki za tę odpowiedź.
Quora Feans

@QuoraFea - jesteś bardzo mile widziany i dziękuję za twoje pytanie. Są mile widziane!
slm

1
@Geek - wypróbuj polecenia. To jest poprawne wyjście z ls -lkatalogu, w którym pliki mają rozmiar 0 i nic więcej jeszcze nie istnieje. Jak tylko podasz jeden z rozmiarów plików, suma pokaże się w / ilość bloków używanych przez pliki. Zobacz moje aktualizacje, jeśli nie masz pewności, dodałem przykład.
slm

20

Oprócz pozostałych dwóch bardzo dobrych odpowiedzi, które otrzymałeś, jeszcze jednym słowem jest użycie

stworzyć fałszywe wrażenie na temat wieku pliku

na przykład do zastosowania w schematach tworzenia kopii zapasowych . Możesz nie chcieć aktualizować kopii zapasowej nowszą, ponieważ są one identyczne lub ponieważ zmiany są nieistotne w porównaniu z kosztem aktualizacji kopii zapasowej, powiedzmy, wolnej linii do zdalnego hosta. Aby to osiągnąć, masz prostą opcję oznaczenia pliku kopii zapasowej nowszym znacznikiem czasu, nie udając, ale oświadczając, że znacznik czasu ważności tego pliku jest teraz inny.

Wrażenie na temat wieku pliku jest obecnie fałszywe, ale jego znaczenie jest prawdziwe i uzasadnione.


20

Jednym z najczęstszych zastosowań touchjest - lub przynajmniej kiedyś - wyzwalanie odbudowy kodu.

Zwykłe narzędzia do budowania - makei ich pochodne - starają się oszczędzać pracę, nie kompilując / przebudowując plików, chyba że jeden z plików, który je utworzył, zmienił się - na przykład, jeśli plik .o jest nowszy niż plik .c źródło, zwykle można bezpiecznie założyć, że źródło C nie zostało zmienione od czasu kompilacji w celu utworzenia tego pliku obiektowego.

Ale są chwile, kiedy chcesz zmusić coś do odbudowy. Możesz dokonać niepotrzebnej modyfikacji jednego z jego plików źródłowych, ale ryzykuje to przypadkowym uszkodzeniem. Zamiast tego możesz po prostu touchplik, dzięki czemu będzie wyglądać na nowy bez ryzyka zmiany jego zawartości - i to wystarczy, aby przekonać, makeże nadszedł czas, aby odbudować wszystko, co zależy od tego pliku.

Istnieją inne zastosowania, ale historycznie było to duże.


Chociaż wydaje się, że dobrym pomysłem jest zmiana pliku w celu spowodowania przebudowy, sprzeciwiłbym się temu. Niektóre systemy weryfikacji kodu źródłowego mogą się mylić na temat zmienionego pliku. Więc touchjest tak źle, jak ręcznej zmiany. Aby spowodować przebudowę, sugeruję usunięcie plików wyjściowych .odanego źródła.
harper

1
Ręczne zmiany i usuwanie plików .o wymagają więcej czasu i pisania, a ręczna zmiana jest znacznie bardziej podatna na błędy. I mówimy tylko o modyfikacji znacznika czasu na kopii roboczej - jeśli później zostaną wprowadzone zmiany, plik poprawnie odzwierciedli znacznik czasu zmiany. I nie wszystkie systemy kontroli wersji są mylone przez znacznik czasu.
David

1
Jak powiedział Dawid. To naprawdę była standardowa praktyka uniksowa nie tak dawno temu i nadal pozostaje standardową praktyką dla programistów pracujących poza IDE.
keshlam

12

Pracowałem z co najmniej jednym frameworkiem internetowym (nie pamiętam, który), który w trybie programowania oglądał pliki kodu źródłowego pod kątem zmian i ponownie załadował aplikację, kiedy to się stało.

Oczywiście czasami chciałeś, aby przeładował się po zmianie czegoś, czego nie oglądał, w którym to przypadku touchzałatwił główny plik konfiguracyjny.

Tak więc w ogólnym przypadku, ilekroć chcesz rozpocząć proces wywołany zmianami w pliku, bez faktycznej zmiany pliku.


4
Tak jest w przypadku mod_wsgi i apache; możesz ponownie załadować, np. aplikację internetową django, po prostu dotykając pliku wsgi.
sapi

11

Uzasadnione użycie dotyku:

  • Zaktualizuj sygnaturę czasową plików graficznych (GIF / JPG / itp.) Do czasu ich zrobienia. Nie wszyscy rendererzy odczytują lub śledzą informacje EXIF.
  • Zachowaj czas c / m podczas masowej aktualizacji zestawu plików, w których znacznik czasu jest ważny dla pakietu plików.
  • Ustaw godzinę pliku wsadowego (np. CSV), jeśli po awarii musisz wykonać kolejny import, a program importu zależy od znacznika czasu (zostaw dyskusję na inny temat :-))
  • Cele archiwalne, tj. Tworzenie kopii zapasowych w folderach na podstawie roku, a następnie ustawienie czasu w tych folderach na 1 stycznia YYYY w celu łatwego sortowania

7

Jednym z zastosowań jest poprawienie znacznika czasu pliku, który został nieprawidłowo ustawiony.

Na przykład w większości przypadków skopiowanie pliku (i w pewien sposób można go przenieść) powoduje, że nowy plik ma znacznik czasu bieżącego czasu, a nie znacznik czasu oryginalnego pliku.

Zwykle nie jest to pożądane. Dotyk może to „naprawić”.

Innym zastosowaniem jest odzwierciedlenie modyfikacji pliku, która została cofnięta przez przywrócenie znacznika czasu pliku do stanu sprzed operacji „edytuj ... cofnij edycję”.


2
W rzeczy samej. Czas, który znalazłem, alias cp='cp --preserve=timestamps'jest bardziej odpowiedni dla mnie na PC…
Runium

5

Ważną różnicą w porównaniu z thingspodobnymi echo(lub nawet lepszymi, > filejak wspominają inni) jest to, że dotyk nie rozbije zawartości. > fileopróżni plik. touchnie będzie. Zamiast myśleć o sztuczkach, aby uniknąć uszkodzenia zawartości, wystarczy dotknąć! I tak będzie mniej działał w jądrze, ponieważ będzie działał tylko z atrybutami pliku bez marnowania czasu na przygotowanie się do otwarcia, a następnie wykonanie zamknięcia.

Dotyk może prawdopodobnie zmienić znacznik czasu, nawet jeśli plik jest obecnie objęty obowiązkową lub doradczą blokadą lub jest wyłączny. Hmmm, nigdy tego nie testowałem ani nie czytałem o tym ...


2
>>dołączy zamiast nadpisywania
Michael Mrozek

Zastanawiałem się, czy o tym nie wspomnieć, ale jeszcze bardziej wkracza to na obszar działań niepożądanych. Trzeba też wspomnieć o tym, że zgłosiłby błąd, gdyby plik był już otwierany na wyłączność itp. Itd. Problem, który może wystąpić również przy użyciu>. Wydaje mi się, że moim drugorzędnym punktem - poza tym podstawowym, że nieznacznie szybciej jest dotknięcie statystyk pliku - jest dobry pomysł, aby napisać kod, który mówi wprost, zamiast krążyć wokół buszu.

4

Oto jeden - używam programu o nazwie SageTV do nagrywania programów telewizyjnych - często są one nagrywane w formacie MPEG-2, który nie jest bardzo wydajnym kodekiem, nie jest też przyjazny dla iPada / iPhone'a. Więc przekonwertowałem pliki na pliki .mp4. Ale podczas odtwarzania plików SageTV oczekuje, że znacznik czasu pliku będzie miał miejsce w momencie rozpoczęcia programu telewizyjnego - jeśli nie, to zepsuło oś czasu programu, aby nie było łatwo FF ani REW. Dlatego używam dotyku, aby zresetować znacznik czasu pliku .mp4, aby był taki sam jak plik orignal.
Czy to jest legalne?


2

Często możesz mieć proces, który zmienia się z identyfikatora użytkownika, na przykład z katalogu głównego -> czegoś innego. Dotyk daje szansę na utworzenie pliku w miejscu, które może dotknąć tylko root, zanim aplikacja zacznie się logować do niego jako inny użytkownik.


To nie jest użycie dotyku niemożliwe do osiągnięcia przez „echo” - patrz oryginalne pytanie autora
Domingo Ignacio Galdos

Echo wymaga otwarcia strumienia i tym podobnych. Dotyk może być bardzo zoptymalizowany poprzez bezpośrednią pracę z i-węzłami. WYDAJNOŚĆ FTW!
user56560

2

W pracy mamy archiwum map cyfrowych sprzed ponad 15 lat. Te stare mapy są zapisywane w różnych formatach, takich jak PostScript, EMF, PRN, hpgl2, pdf itp., Których większość programów nie rozumie. Lub potrzebujesz kilkunastu różnych programów, aby zobaczyć je wszystkie.

Aby ułatwić wyszukiwanie i przeglądanie wszystkich tych różnych formatów, tworzymy wersje map JPEG, a następnie używamy dotyku, aby dopasować plik JPEG do znacznika czasu oryginalnego pliku źródłowego - często lata po jego utworzeniu.

Teraz możemy użyć jednego programu, takiego jak Picasa, aby zobaczyć całą bibliotekę i w prosty sposób zlokalizować określone zakresy dat. Bez dotyku musielibyśmy dodać metadane daty dla każdego obrazu, prawdopodobnie ręcznie, a następnie wyszukać te ciągi, szukając określonego zakresu dat.


1

Nie wykorzystałem go jeszcze do tego celu, ale mam skrypt, który odczytuje pliki i ich daty z katalogu i odczytuje je do użycia na stronie internetowej. Jeśli będę musiał edytować jeden, zmieni on datę. Rozważałam touching je zresetować ich kolejność.


1

Niektóre skrypty inicjujące porównują znacznik czasu pliku konfiguracyjnego z własnym plikiem pid. Wynik decyduje, czy przeładować działającą usługę, czy nie.

Jeśli występuje sytuacja, w której nie chcesz zmieniać konfiguracji, ale chcesz wymusić ponowne załadowanie, dotknij tutaj.


0

Mam zadanie cron, które pobiera zmiany z bazy danych, które wystąpiły między ostatnim uruchomieniem zadania a bieżącym uruchomieniem. Tworzy plik XML zmian, które następnie są przetwarzane w innej bazie danych. Pobiera ostatni czas działania ze znacznika czasu w pliku wyjściowym XML. *

Jeśli cokolwiek pójdzie nie tak podczas przetwarzania pliku XML, mógłbym chcieć powtórzyć uruchomienie od oryginalnej daty, a nie od daty, o której mowa w sygnaturze czasowej nowego pliku XML.

Najprostszym sposobem na dokonanie tego, zamiast edytowania wywoływanych skryptów itp., Jest dotknięcie pliku XML i wymuszenie znacznika czasu na wymaganą datę.

Również jeśli zacznę od nowa (bez wcześniejszego pliku wyjściowego XML), mogę po prostu symulować jego istnienie za pomocą dotyku.

[*] Zanim ktoś to zauważy - zdaję sobie sprawę z tego, że czas rozpoczęcia zadania i zapis pliku XML pozostawia kilkuminutową przerwę, w której mogą wystąpić zmiany DB. Zadanie jest uruchamiane w czasie, gdy zmiany DB są bardzo mało prawdopodobne. To moja wymówka i trzymam się jej :-)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.