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

Существует большая разница между перезаписью файла и записью в файл.

Когда вы перезаписываете /dev/null, например,

$ echo Hello > /dev/null
[d5 ] ... он бесшумно отбрасывается. Для этого вам нужны права на запись в /dev/null, которые у всех есть:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

Когда вы перезаписываете /dev/null, как и в случае с командой mv, вы заменяете специальный файл /dev/null с тем, что вы там переехали. Не делай этого! Причина, по которой вам нужны привилегии root для этого, заключается в том, что для перезаписывания файла вам нужно писать записи в , в этом случае /dev:

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

Чтобы восстановить [ f11], выдать команды

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

(Также см. U & amp; L StackExchange: Как создать /dev/null)

1
задан 30 September 2016 в 05:33

2 ответа

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

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

Использование 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 для отображения или обработки всех файлов, которые были изменены в этот час (время между этими двумя файлами, например, с 10: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

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

Использование перенаправления вывода перенаправит стандартный вывод в указанный файл. В зависимости от ваших настроек clobber / noclobber, если это может быть неудачно.

Существует несколько версий вывода перенаправления, которые включают в себя:

> - Redirect standard output. Create or overwrite the existing file. >> - Redirect append. Create or append to existing file. >& - Redirect both standard output and standard error. >>& - Redirect/Append both standard output and standard error

Мы могли бы использовать наш find чтобы перенаправить содержимое всех файлов, созданных в течение указанного часа, на файл, который мы могли бы зарегистрировать и изучить позже:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
13
ответ дан 23 May 2018 в 05:38
  • 1
    Многие люди упомянули, что если file.txt существует и не пуст, тогда > file.txt очистит его содержимое, но touch file.txt не будет. Но никто не упомянул, что >> file.txt является хорошей заменой для touch file.txt - он создаст файл, если он не существует (если у вас есть разрешение на это), но он не будет обрезать существующий файл. См. . В чем разница между «& gt;» и «& gt; & gt;»?? – G-Man 1 October 2016 в 05:42
  • 2
    Это объясняется в разделе Usage of Output redirection. Обратите внимание, что >> = Redirect append>. – L. D. James 1 October 2016 в 07:41
  • 3
    Да, и это совершенно ясно - людям, которые уже знают это. Поставьте себя на место OP - вы разместили стену с текстом Too Long Too Read ; он не поймет из вашего ответа, что >> file.txt является выполнимой заменой для touch file.txt. (Тот факт, что вы единственный, кто упомянул >> вообще , - это то, почему я отправил свой комментарий под ваш ответ, а не под вопрос.) – G-Man 1 October 2016 в 10:52
  • 4
    @ G-Man Некоторые люди путают символ переадресации в качестве замены для прикосновения. Однако это не замена. Подробности моего ответа - прояснить эту ошибку. Примеры использования этих двух способов помогут прояснить это. Обратите внимание, что первая строка линии отвечает исходным особенностям вашего текущего комментария. В нем говорится, что между ними существует значительная разница. ОП заинтересована в различии. Таким образом, другие части ответа - ответить на интерес OP к этим двум. Существуют разные эффекты, и есть причины для разницы. – L. D. James 1 October 2016 в 10:59

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

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

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

 >file.txt

Типичным обходным путем является добавление команды : (true) no-op:

 : >file.txt

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

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

7
ответ дан 23 May 2018 в 05:38
  • 1
    zsh поддерживает пустое перенаправление - он действует аналогично перенаправлению cat без аргументов в файл. В основном все, что вы напечатаете, будет записано в файл до символа EOF или прерывания. Это отражает поведение zsh с помощью только <file, который просто печатает содержимое файла, как это делал cat. Они могут быть конфигурируемы, я видел, что <file открывает файл в пейджере. – 8bittree 30 September 2016 в 19:33
  • 2
    @ 8bittree Я имел в виду, что вам нужно ввести EOF (например, делать cat >file.txt, как вы сказали), где в bash просто делать >file.txt было бы достаточно. – heemayl 30 September 2016 в 19:36
  • 3
    Достаточно справедливо, я предложил редактирование, которое, как я думаю, получает идею более четко. – 8bittree 30 September 2016 в 19:40
  • 4
    @ 8bittree Approved. – heemayl 30 September 2016 в 19:41

Другие вопросы по тегам:

Похожие вопросы: