Чим відрізняється сенсорний файл від> файл?


17

Я є новачком в Linux, і мені цікаво, чи мають >та чи touchмають однаковий ефект. Я маю на увазі, чи мають наступні дві команди однаковий ефект ?:

$ > file.txt

$ touch file.txt

Якщо так, то було б чудово знати, що я можу просто набрати `> file.txt ', щоб створити нові файли.


5
Якщо file.txtвже існує і не пустує, вони, звичайно, ні.
fkraiem

1
@fkraiem, чи не могли б ви дати детальну відповідь?
lmiguelvargasf

4
Він каже, що якщо у вас touchфайл, який містить дані, нічого не відбудеться, але якщо ви >його будете видалені
WinEunuuchs2Unix

Зрозумів. Дякую вам за роз'яснення @ WinEunuuchs2Unix
lmiguelvargasf

Ви хочете відповісти на питання, чи відповісти на це питання, чи відповісти на нього @fkraiem чи видалити?
WinEunuuchs2Unix

Відповіді:


24

І те, touchі >інше створить новий файл, якщо його не існує. Як показано наступні команди терміналів, коли ви touchнаявний файл, час доступу / останнього зміненого часу оновлюється. Але якщо ви перебуваєте >у наявному файлі, він врізається, а останній модифікований час оновлюється (часу доступу немає). Зауважте, що >файл не видаляється / від’єднується. Inode залишається тим самим - саме тому >/ або truncateзазвичай використовуються для очищення файлів журналів навіть з відкритою ручкою файлів.

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

Як згадується в коментарях, touchце зовнішня команда і працює лише на файли. >це вбудована функція оболонки, яка служить безлічі різних цілей. Як правило, ви б бачили, як це використовується cat source.fil > target.fil.

Довга форма для спорожнення файлу буде такою:

cat /dev/null > emptyme.fil

Використання > emptme.filвиконує те саме в компактному форматі, щоб нічого не перенаправляти у файл.


Використовуйте регістр: > file.txtдобре для очищення файлів журналів.
Rinzwind

8
Він фактично не створений заново. Існуючий файл усікається, що відрізняється від від’єднання старого файлу та створення нового. Найбільша помітна відмінність полягає в тому, що якщо процес все ще має старий файл, відкритий чи відображений, він все одно існуватиме. Але обрізання вплине на файл, відкритий іншими процесами.
Пітер Кордес

1
Не впевнений у "найбільшій спостережливості" - легко спостерігати, чи не порушено жорсткі посилання (якщо ви ln foo bar, а потім видаляєте та відтворюєте foo, barвсе ще має попередній вміст).
Чарльз Даффі

1
О так, це ще легше помітна різниця. Я мав би подумати про це: P
Пітер Кордес

@ Чарльз-Даффі Впевнений, коли є два посилання на фій, що було б очевидно, я думаю, це не має нічого спільного з тим, що говорив Пітер Кордес. Якщо ви видаляєте / від’єднуєте файл, який зараз використовується / має відкритий файл, він не видаляється. Наприклад, скажіть, що у вас, rm /var/log/nginx/access.logколи nginx відкрив цей файл, він матиме 0 посилань, але inode все ще існуватиме. lsof -c nginx | grep access.logпотім з pid ls -l /proc/<pid>/fd/ | grep access.logта нарешті cat / proc / <pid> / fd / <ім'я файлу з попередньої команди> `. Коментуючи, хоча це старе. Сподіваюсь, це мало сенс
шуруповерт

14

Існує істотна різниця між ними. Touchце команда, яка використовується для штампування файлу часу. >Символ являє собою стандартний вихідний редиректор.

Використання двох пояснених

Використання дотику

Якщо файл не існує, він створить файл.

Дотик зазвичай використовується для створення прапорів. Наприклад, якщо ви хочете знайти всі файли від двох разів у вашій системі, ви можете використовувати цю послідовність команд:

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

Це створить такі файли (або змінить часову марку, якщо вони існують):

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

Тепер ви можете використовувати функцію пошуку для відображення або обробки всіх файлів, які були змінені за ту годину (час між цими двома файлами часу, тобто між 22:00 та 23:00 29 вересня 2016 року).

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

Це частковий вихід вищезгаданої команди find:

-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

Використання перенаправлення вихідних даних

Символ перенаправлення переадресації перенаправить стандартний вихід на вказаний файл. Залежно від налаштувань клоберу / ноклобубера, якщо це може бути невдалим. Noclobber створить файл лише тоді, коли його не існує.

Існує ряд версій виводу перенаправлення, який включає:

> - Перенаправити стандартний вихід. Створити або перезаписати існуючий файл.
>> - Додаток з перенаправленням. Створіть або додайте до існуючого файлу.
> & - Перенаправлення як стандартного виводу, так і стандартної помилки.
>> & - Перенаправлення / Додавання як стандартного виводу, так і стандартної помилки

Ми могли б скористатися нашою findкомандою вище, щоб перенаправити вміст усіх файлів, створених протягом зазначеної години, на файл, який ми могли б увійти та вивчити пізніше:

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

Багато людей згадували, що якщо file.txtіснує і не є порожнім, то > file.txtвін очистить його вміст, але touch file.txtне буде. Але ніхто не згадував, що >> file.txtце хороша заміна touch file.txt- він створить файл, якщо його не існує (якщо вважати, що у вас є дозвіл на це), але він не буде усікати існуючий файл. Див. Яка різниця між ">" та ">>"?
G-Man каже: "Відновіть Моніку"

Це пояснено у розділі Usage of Output redirection. Повідомлення говорить >>= Redirect append>.
LD James

Так, і це абсолютно зрозуміло - людям, які це вже знають. Поставте себе у взутті ОП - ви розмістили стіну тексту, що занадто довго читати ; він не збирається зрозуміти з вашої відповіді, що >> file.txtце працездатна заміна touch file.txt. (Справа в тому, що ти єдина людина, яка >> взагалі згадувала , чому я розмістила свій коментар під вашою відповіддю, а не під питанням.)
G-Man каже: "Відновити моніку"

1
@ G-Man Деякі люди плутають символ переадресації як заміну дотику. Однак це не заміна. Деталі моєї відповіді - це з’ясувати цю помилку. Приклади використання обох - допомогти уточнити це. Будь ласка, зауважте, що перша пара рядків відповідає початковій специфіці вашого поточного коментаря. Це говорить про те, що існує значна різниця між ними. ОП зацікавлена ​​в різниці. Тож інші частини відповіді - відповідати на зацікавленість ОП у двох. Є різні ефекти, і причини є різницею.
LD James

9

>є оператором переадресації виходу оболонки, який використовується для перенаправлення STDOUT попередньої команди (команд) на дескриптор файлу, згаданий після >. Якщо файл присутній, його вміст буде усічений, як файл із open(2)-ed з O_TRUNCпрапором, і якщо файл не існує, він буде створений.

Важливо зазначити, що цей оператор перенаправлення буде оброблятися оболонкою до запуску попередньої команди, тому це не залежить від будь-якої команди, а керується самою оболонкою.

Зауважте, що деякі оболонки (наприклад zsh) поводяться по-різному з порожнім перенаправленням, наприклад:

 >file.txt

Типовим способом вирішення є додавання команди :( true) no-op:

 : >file.txt

Традиційно основною метою програми touchє зміна часової позначки файлу, а не створення файлу.

touchстворює файл лише тоді, коли файлів, згаданих у аргументі, не існує, інакше він змінює час модифікації файлу на поточну часову позначку. Ви також можете змінити час доступу та час створення Inode, використовуючи touch.


zshпідтримує порожнє перенаправлення - воно діє аналогічно перенаправлення catбез аргументів до файлу. В основному все, що ви введете, записується у файл до появи символу EOF або переривання. Це відображає zshповедінку з справедливим <file, який просто друкує вміст файлу, як catце робиться. Вони можуть бути налаштовані, я бачив <fileвідкриття файлу в пейджері.
8bittree

@ 8bittree Що я мав на увазі, що вам потрібно ввести EOF(як робити так, cat >file.txtяк ви сказали), де bashдостатньо лише робити >file.txt.
heemayl

Досить справедливо, я запропонував редагування, яке, на мою думку, зрозуміло зрозуміло.
8bittree

@ 8bittree Затверджено
heemayl

(1) За замовчуванням touchоновляється як час модифікації, так і час доступу до файлу. Існують варіанти оновлення лише одного чи іншого. (2) Unix / Linux / POSIX взагалі не підтримують "час створення inode". Деякі типи файлової системи підтримують її, але не існує універсального способу розглянути її, не кажучи вже про модифікацію. Чи можете ви надати посилання, яке говорить про те, що існує втілення, touchяке дозволяє користувачеві змінювати час створення inode?
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.