Apa perbedaan antara file sentuh dan file?

17

Saya jenis pemula untuk Linux, dan saya bertanya-tanya apakah atau tidak >dan touchmemiliki efek yang sama. Maksud saya, apakah dua perintah berikut ini memiliki efek yang sama ?:

$ > file.txt

$ touch file.txt

Jika demikian, akan lebih baik mengetahui bahwa saya bisa mengetikkan `> file.txt 'untuk membuat file baru.

lmiguelvargasf
sumber
5
Jika file.txtsudah ada dan tidak kosong, tentu saja tidak.
fkraiem
1
@ fkraiem, bisakah Anda membuat jawaban yang rumit?
lmiguelvargasf
4
Dia mengatakan jika Anda touchfile yang berisi data tidak akan terjadi apa-apa, tetapi jika Anda >file itu akan dihapus.
WinEunuuchs2Unix
Saya mendapatkannya. Terima kasih banyak untuk klarifikasi itu @ WinEunuuchs2Unix
lmiguelvargasf
Apakah Anda ingin menjawab pertanyaan, minta saya menjawab pertanyaan, minta @fkraiem menjawabnya, atau menghapusnya?
WinEunuuchs2Unix

Jawaban:

24

Keduanya touchdan >akan membuat file baru jika tidak ada. Seperti yang ditunjukkan oleh perintah terminal berikut ketika Anda touchmemiliki file yang ada, akses / waktu modifikasi terakhir diperbarui. Tetapi jika Anda >ke file yang sudah ada itu terpotong dan waktu modifikasi terakhir diperbarui (waktu akses tidak). Catatan yang >tidak menghapus / membatalkan tautan file. Inode tetap sama - itulah sebabnya >/ atau truncatebiasanya digunakan untuk menghapus file log bahkan dengan pegangan file yang terbuka.

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

Seperti disebutkan dalam komentar, touchadalah perintah eksternal dan hanya beroperasi pada file. >adalah fitur bawaan shell yang melayani berbagai keperluan. Biasanya Anda akan melihatnya seperti dulu cat source.fil > target.fil.

Bentuk panjang untuk mengosongkan file adalah:

cat /dev/null > emptyme.fil

Menggunakan > emptme.filmencapai hal yang sama dalam format kompak untuk tidak mengarahkan apa pun ke file.

WinEunuuchs2Unix
sumber
Use case: > file.txtbaik untuk membersihkan file log.
Rinzwind
8
Ini sebenarnya tidak diciptakan kembali. File yang ada terpotong, yang berbeda dari memutuskan tautan file lama dan membuat yang baru. Perbedaan terbesar yang dapat diamati adalah bahwa jika suatu proses masih memiliki file lama terbuka atau dipetakan, itu akan tetap ada. Tetapi memotong akan memengaruhi file yang telah dibuka oleh proses lain.
Peter Cordes
1
Tidak yakin tentang "terbesar yang dapat diamati" - mudah untuk mengamati apakah hardlink rusak (jika Anda ln foo bar, lalu menghapus dan membuat ulang foo, barmasih memiliki konten sebelumnya).
Charles Duffy
1
Oh ya, itu perbedaan yang bahkan lebih mudah diamati. Saya seharusnya memikirkan itu: P
Peter Cordes
@ Charles-Duffy Tentu, ketika ada 2 tautan ke fie yang jelas saya kira, itu tidak ada hubungannya dengan apa yang dikatakan Peter Cordes. Ketika Anda menghapus / membatalkan tautan file yang sedang digunakan / telah membuka filehandle, itu tidak dihapus. misalnya, katakan Anda rm /var/log/nginx/access.logsementara nginx membuka file itu akan memiliki 0 tautan tetapi inode akan tetap ada. lsof -c nginx | grep access.logkemudian dengan pid, ls -l /proc/<pid>/fd/ | grep access.logdan akhirnya cat / proc / <pid> / fd / <nama file dari perintah sebelumnya> `. Mengomentari meskipun ini sudah lama. Semoga masuk akal
skrewler
14

Ada perbedaan mendasar antara keduanya. Touchadalah perintah yang digunakan untuk menandai waktu file. The >simbol adalah redirector output standar.

Penggunaan keduanya menjelaskan

Penggunaan Sentuhan

Jika file tidak ada, itu akan membuat file.

Sentuhan biasanya digunakan untuk membuat bendera. Misalnya jika Anda ingin menemukan semua file antara dua kali di sistem Anda, Anda dapat menggunakan urutan perintah ini:

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

Ini akan membuat file-file berikut (atau mengubah cap waktu jika ada):

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

Sekarang Anda dapat menggunakan find untuk menampilkan atau memproses semua file yang dimodifikasi pada jam tersebut (waktu antara kedua file waktu itu, yaitu antara 22:00 dan 23:00 pada 29 September 2016).

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

Ini adalah sebagian output dari perintah find di atas:

-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

Penggunaan pengalihan Output

Simbol pengarahan ulang akan mengarahkan output standar ke file yang ditentukan. Tergantung pada pengaturan clobber / noclobber Anda jika bisa gagal. Noclobber hanya akan membuat file jika tidak ada.

Ada beberapa versi output redirection yang meliputi:

> - Redirect output standar. Buat atau timpa file yang ada.
>> - Redirect append. Buat atau tambahkan ke file yang ada.
> & - Mengarahkan output standar dan kesalahan standar.
>> & - Redirect / Menambahkan keluaran standar dan kesalahan standar

Kami dapat menggunakan findperintah kami di atas untuk mengarahkan ulang isi semua file yang dibuat dalam waktu yang ditentukan ke file yang bisa kami catat dan pelajari nanti:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
LD James
sumber
Banyak orang telah menyebutkan bahwa, jika file.txtada dan tidak kosong, maka > file.txtakan menghapus isinya tetapi touch file.txttidak. Tapi tidak ada yang menyebutkan itu >> file.txtadalah pengganti yang baik touch file.txt- itu akan membuat file jika tidak ada (dengan asumsi Anda memiliki izin untuk melakukannya), tetapi itu tidak akan memotong file yang sudah ada. Lihat Apa perbedaan antara ">" dan ">>"?
G-Man Mengatakan 'Reinstate Monica'
Ini dijelaskan di bagian ini Usage of Output redirection. Pemberitahuan dikatakan >>= Redirect append>.
LD James
Ya, dan itu sangat jelas - bagi orang yang sudah mengetahuinya. Tempatkan diri Anda pada posisi OP - Anda telah memposting dinding teks yang Terlalu Panjang Dibaca ; dia tidak akan mengerti dari jawaban Anda yang >> file.txtmerupakan pengganti yang bisa diterapkan touch file.txt. (Fakta bahwa Anda adalah satu-satunya orang yang disebutkan >> di semua adalah mengapa saya memposting komentar saya di bawah jawaban Anda, daripada di bawah pertanyaan.)
G-Man Mengatakan 'Reinstate Monica'
1
@ G-Man Beberapa orang mengacaukan simbol pengalihan untuk menjadi pengganti sentuhan. Namun itu bukan pengganti. Rincian jawaban saya adalah untuk mengklarifikasi kesalahan ini. Contoh penggunaan keduanya adalah untuk membantu memperjelasnya. Harap perhatikan baris pasangan pertama menjawab spesifik awal komentar Anda saat ini. Dikatakan ada perbedaan yang signifikan antara keduanya. OP tertarik pada perbedaannya. Jadi, bagian lain dari jawabannya adalah menanggapi minat OP terhadap keduanya. Ada efek yang berbeda dan ada alasan untuk perbedaan itu.
LD James
9

>adalah operator redirection output shell, yang digunakan untuk mengarahkan STDOUT dari perintah sebelumnya ke deskriptor file yang disebutkan setelah >. Jika file ada, isinya akan terpotong, seperti file dengan open(2)-ed dengan O_TRUNCflag, dan jika file tidak ada, itu akan dibuat.

Penting untuk dicatat bahwa, operator pengalihan ini akan ditangani oleh shell sebelum perintah sebelumnya berjalan, jadi ini tidak tergantung pada perintah apa pun, dan ditangani oleh shell itu sendiri.

Perhatikan bahwa, beberapa shell (mis. zsh) Akan berperilaku berbeda dengan pengalihan kosong seperti:

 >file.txt

Solusi yang umum adalah menambahkan :( true) perintah no-op:

 : >file.txt

Secara tradisional, tujuan utama touchadalah untuk mengubah timestamp file, bukan membuat file.

touchmembuat file, hanya ketika file yang disebutkan dalam argumen tidak ada, jika tidak mengubah waktu modifikasi file ke cap waktu saat ini. Anda juga dapat mengubah waktu akses, dan menggunakan waktu pembuatan inode touch.

heemayl
sumber
zshtidak mendukung pengalihan kosong - ini bertindak sangat mirip dengan mengarahkan ulang cattanpa argumen ke file. Pada dasarnya apa pun yang Anda ketik akan ditulis ke file hingga karakter EOF atau interupsi. zshPerilaku mirror ini dengan adil <file, yang hanya mencetak konten file, seperti yang catakan dilakukan. Ini mungkin dapat dikonfigurasi, saya telah melihat <filemembuka file dalam pager.
8bittree
@ 8bittree Apa yang saya maksud adalah Anda perlu memasukkan EOF(seperti melakukan cat >file.txtseperti yang Anda katakan), di mana bashmelakukan saja >file.txtsudah cukup.
heemayl
Cukup adil, saya menyarankan edit yang saya pikir mendapatkan ide lebih jelas.
8bittree
@ 8bittree Disetujui.
heemayl
(1) Secara default, touchmemperbarui waktu modifikasi dan waktu akses file. Ada opsi untuk memperbarui hanya satu atau yang lain. (2) Unix / Linux / POSIX tidak mendukung "waktu pembuatan inode", secara umum. Beberapa tipe sistem file mendukungnya, tetapi tidak ada cara universal untuk melihatnya, apalagi memodifikasinya. Bisakah Anda memberikan referensi yang mengatakan bahwa ada inkarnasi touchyang memungkinkan pengguna untuk mengubah waktu pembuatan inode?
Scott