В чем разница между сенсорным файлом и> файлом?


17

Я вроде новичок в Linux, и мне интересно , или нет , >и touchиметь тот же эффект. Я имею в виду, имеют ли следующие две команды одинаковый эффект ?:

$ > file.txt

$ touch file.txt

Если это так, было бы здорово знать, что я могу просто набрать `> file.txt 'для создания новых файлов.


5
Если file.txtуже существует и не пусто, они, конечно, нет.
30.09.16

1
@fkraiem, не могли бы вы дать подробный ответ?
lmiguelvargasf

4
Он говорит, что если у вас touchфайл, содержащий данные, ничего не произойдет, но если у вас >файл, он будет удален.
WinEunuuchs2Unix

Я понял. Большое спасибо за это разъяснение @ WinEunuuchs2Unix
lmiguelvargasf

Вы хотите ответить на вопрос, попросить меня ответить на вопрос, попросить @fkraiem ответить или удалить его?
WinEunuuchs2Unix

Ответы:


24

И то touchи другое >создаст новый файл, если он не существует. Как показывают следующие команды терминала, когда вы touchиспользуете существующий файл, время доступа / последнего изменения обновляется. Но если у вас >есть существующий файл, он усекается, а время последнего изменения обновляется (время доступа - нет). Обратите внимание, что >не удаляет / не связывает файл. Индекс остается тем же самым - именно поэтому >/ или 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
Питер Кордес

@ Charles-Duffy Конечно, когда есть две ссылки на тьфу, я думаю, это не имеет ничего общего с тем, что говорил Питер Кордес. Когда вы удаляете / отменяете связь с файлом, который используется / имеет открытый дескриптор файла, он не удаляется. например, скажем, что если у rm /var/log/nginx/access.lognginx был открыт этот файл, то на нем было бы 0 ссылок, но индекс по-прежнему существовал. lsof -c nginx | grep access.logзатем с pid ls -l /proc/<pid>/fd/ | grep access.logи, наконец, cat / proc / <pid> / fd / <имя файла из предыдущей команды> `. Комментировать, хотя это старый. Надеюсь, что это имело смысл
Skrewler

14

Между ними есть существенная разница. Touchкоманда, используемая для отметки времени файла >Символ представляет собой стандартный выходной редиректор.

Использование двух объяснил

Использование 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

Теперь вы можете использовать find, чтобы отобразить или обработать все файлы, которые были изменены в этот час (время между этими двумя отметками времени, то есть между 22:00 и 23:00 по 29 сентября 2016 г.).

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

Это частичный вывод приведенной выше команды поиска:

-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

Использование перенаправления вывода

Символ перенаправления перенаправит стандартный вывод в указанный файл. В зависимости от ваших настроек clobber / noclobber, если может произойти сбой. 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>.
Л.Д. Джеймс

Да, и это совершенно ясно - людям, которые это уже знают. Поставьте себя на место ОП - вы разместили стену с текстом « Слишком длинная, слишком читаемая» ; из вашего ответа он не поймет, что >> file.txtэто подходящая замена touch file.txt. (Тот факт, что вы единственный человек, который упомянул >> вообще, является причиной того, что я разместил свой комментарий под вашим ответом, а не под вопросом.)
G-Man говорит: «Восстановите Монику»

1
@ G-Man Некоторые люди путают символ перенаправления, чтобы заменить сенсорный. Однако это не замена. Детали моего ответа, чтобы уточнить эту ошибку. Примеры использования двух, чтобы помочь прояснить это. Пожалуйста, обратите внимание, что первая пара строк отвечает на начальные особенности вашего текущего комментария. Это говорит о существенной разнице между ними. ОП интересует разница. Таким образом, другие части ответа должны ответить на интерес OP к двум. Есть разные эффекты и есть причины для различий.
Л.Д. Джеймс

9

>является оператором перенаправления вывода оболочки, используемым для перенаправления STDOUT предыдущей команды в дескриптор файла, упомянутый после >. Если файл присутствует, его содержимое будет усечено, как файл open(2)с O_TRUNCфлагом -ed , а если файл не существует, он будет создан.

Важно отметить, что этот оператор перенаправления будет обрабатываться оболочкой до запуска предыдущей команды, поэтому это не зависит от какой-либо команды и обрабатывается самой оболочкой.

Обратите внимание, что некоторые оболочки (например zsh) будут вести себя по-разному с пустым перенаправлением, как:

 >file.txt

Типичный обходной путь - добавить команду :( true) no-op:

 : >file.txt

Традиционно основной целью touchявляется изменение временной метки файла, а не создание файла.

touchсоздает файл, только когда файлов, упомянутых в аргументе, не существует, в противном случае он изменяет время изменения файла на текущую метку времени. Вы также можете изменить время доступа и время создания inode, используя touch.


zshподдерживает пустое перенаправление - оно действует подобно перенаправлению catбез аргументов в файл. По сути, все, что вы вводите, будет записано в файл до символа EOF или прерывания. Это отражает zshповедение команды just <file, которая просто печатает содержимое файла, как catи делает. Они могут быть настраиваемыми, я видел <fileоткрыть файл в пейджере.
8bittree

@ 8bittree То, что я имел в виду, это то, что вы должны ввести EOF(например, делать, cat >file.txtкак вы сказали), где bashдостаточно просто делать >file.txt.
Heemayl

Достаточно справедливо, я предложил редактирование, которое, я думаю, объясняет идею более четко.
8bittree

@ 8bittree Утверждено.
Heemayl

(1) По умолчанию touchобновляет время модификации и время доступа к файлу. Есть варианты обновления только одного или другого. (2) Unix / Linux / POSIX вообще не поддерживают «время создания инода». Некоторые типы файловых систем поддерживают это, но нет универсального способа посмотреть на него, не говоря уже о том, чтобы изменить его. Можете ли вы предоставить ссылку, в которой говорится, что существует воплощение touch, позволяющее пользователю изменять время создания инода?
Скотт,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.