ගොනුවක අන්තර්ගතය හිස් කරන්න


230

ගොනුවකින් සියලුම ඇතුළත් කිරීම් මකා දැමීමේ ක්‍රම තුනක් ගැන මම දනිමි.

අර තියෙන්නේ

  • >filename
  • touch filename
  • filename < /dev/null

මෙම තිදෙනාගෙන් මම >filenameවැඩිපුරම අතවර කරන්නේ අවම යතුරු එබීම් සංඛ්‍යාවක් අවශ්‍ය නිසාය.

කෙසේ වෙතත්, විශාල ලොග් ලිපිගොනු සහ කුඩා ලිපිගොනු සම්බන්ධයෙන් තිදෙනාගෙන් වඩාත්ම කාර්යක්ෂම වන්නේ කුමක්ද (වඩා කාර්යක්ෂම ක්‍රම තිබේ නම්) දැන ගැනීමට මම කැමතියි.

එසේම, කේත තුන ක්‍රියාත්මක වන්නේ කෙසේද සහ අන්තර්ගතය මකා දමන්නේ කෙසේද?


29
කුමක් ගැනද truncate -s 0 filename?
මාටින් තෝමා


පළමුවැන්න ක්‍රියාත්මක වන්නේ bash විධාන රේඛාවෙන් ඇමතුමක් ලැබුවහොත් පමණි. නමුත් .sh ගොනුවකින් ක්‍රියාත්මක කළහොත් එය ක්‍රියා නොකරනු ඇත
Marco Marsala

8
ස්පර්ශය අන්තර්ගතය මකා නොදමනු ඇත, නමුත් ගොනුවේ ප්‍රවේශ වේලාව වෙනස් කරයි. එය කරන්නේ කෙසේද නිර්මාණය කිසිවක් පැවති නම් හිස් ගොනුවක්.
hbogert

Answers:


305

ඇත්ත වශයෙන්ම, දෙවන පෝරමය touch filenameගොනුවෙන් කිසිවක් මකා නොදමයි - එය හිස් ගොනුවක් සාදන්නේ එකක් නොතිබුනේ නම් පමණි, නැතහොත් පවතින ගොනුවක අවසන් වරට වෙනස් කරන ලද දිනය යාවත්කාලීන කරයි.

තෙවනුව ආදාන ලෙස filename < /dev/nullගොනු නාමය ධාවනය කිරීමට උත්සාහ කරයි /dev/null.

cp /dev/null filename කටයුතු.

කාර්යක්ෂමතාව සඳහා, වඩාත්ම කාර්යක්ෂම වනු ඇත්තේ truncate -s 0 filename; මෙහි බලන්න: http://linux.die.net/man/1/truncate .

එසේ නැත්නම්, cp /dev/null filenameහෝ > filenameදෙකම හොඳින්. කප්පාදු-විවෘත සැකසුම භාවිතා කරමින් ඔවුන් දෙදෙනාම ගොනුව විවෘත කර වසා දමයි. cpඑය විවෘත /dev/nullවන අතර එමඟින් එය සුළු වශයෙන් මන්දගාමී වේ.

අනෙක් අතට, ස්ක්‍රිප්ට් එකකින් ධාවනය වන විට truncateවඩා මන්දගාමී වනු ඇත , > filenameමන්දයත්, කප්පාදු කිරීමේ විධානය ක්‍රියාත්මක කිරීම මඟින් පද්ධතියට ක්‍රියාත්මක කළ හැකි දේ විවෘත කිරීම, එය පැටවීම සහ ධාවනය කිරීම අවශ්‍ය වේ.


9
ඉතින් truncateඑය වඩාත් කාර්යක්ෂම යැයි ඔබ කියන්නේ ඇයි ?
ස්ටෙෆාන් චසෙලාස්

7
කප්පාදු කිරීමේ මෙහෙයුම ගොනුව විවෘත කිරීමට කරදර නොවන ftruncate () හෝ truncate () පද්ධති ඇමතුම භාවිතා කරයි. සීපී සහ > filenameක්‍රම ඇමතීමට අවශ්‍ය සමීප () පද්ධති ඇමතුම ද එය වළක්වයි .
අළු

3
ඇත්ත වශයෙන්ම, එය (අවම වශයෙන් GNU එකක්) විවෘත + ftruncate + close එකක් කරයි (බොහෝ පද්ධති ඇමතුම් වලට අමතරව එය පැටවීම සහ ආරම්භ කිරීම සිදු කරයි), කෙසේ වෙතත්, එය නොපවතින නම් ගොනුව නිර්මාණය කිරීමට සිදුවේ. හා truncate(2)ඒක කරන්න වෙන්නේ නැහැ.
ස්ටෙෆාන් චසෙලාස්

අප භාවිතා කරන්නේ නම් touch filename, ඉනෝඩය එලෙසම පවතිනු ඇත්ද (මීට පෙර ගොනුවක් තිබුනේ නම්)?
pMan

1
ManpMan ඔව්, ඔබට එය උත්සාහ කර පරීක්ෂා කළ හැකියls -i
terdon

45

වෙනත් විකල්පයක් විය හැකිය:

echo -n > filename

මිනිසාගේ පිටුවෙන් echo:

-n Do not print the trailing newline character.


ප්‍රමාණය සකසන්නේ කෙසේද? මට ශුන්‍ය අක්ෂර 30000 ක් අවශ්‍යදැයි කියන්න?
පරිශීලක

5

":" බිල්ඩින් විධානයක් ඇත, එය sh, csh, bash සහ වෙනත් අයගෙන් ලබා ගත හැකිය, එය යළි-යොමුවීමේ ප්‍රතිදාන ක්‍රියාකරු සමඟ පහසුවෙන් භාවිතා කළ හැකිය >ගොනුවක් කප්පාදු කරන්න:

#!/usr/bin/env bash
:> filename

මම මේ සඳහා කැමති දෙය නම්, එයට "echo" වැනි බාහිර විධානයන් අවශ්‍ය නොවන බවයි.

ලිපිගොනු මකාදැමීම / ප්‍රතිනිර්මාණය කිරීම වෙනුවට ඒවා කපා දැමීමේ එක් විශාල වාසියක් නම්, මෙම ගොනුව සමඟ ක්‍රියා කරන යෙදුම් ධාවනය කිරීම (උදා: යමෙකු tail -f filenameඅධීක්ෂණ මෘදුකාංගයක් සාදයි , ...) එය නැවත විවෘත කළ යුතු නැත. ඔවුන්ට ගොනු ලිපිගොනුව දිගටම භාවිතා කළ හැකි අතර සියලු නව දත්ත ලබා ගත හැකිය.


man bashවිස්තර කරන :කිසිදු බලපෑමක් ඇති ලෙස ෂෙල් builtin.
හැක්සෙල්

ඔව්, ඔබ මෙය >ගොනුව වෙත හරවා යවන අතර එය ගොනුව නොපවතින නම් එය නිර්මාණය කරයි, එය පවතින්නේ නම් එය ශුන්‍යයට කපා දමන්න. වඩා හොඳ කීවේ: ඔබ කිසිවක් නොකර සිටීමට :භාවිතා >කරන අතර ගොනුවකට කිසිවක් හරවා යැවීමට භාවිතා කර එය කපා දමන්න.
මිර්කෝ ස්ටයිනර්

1
ඇයි ඔබ එය කරන්නේ? > fileගොනුවක් කප්පාදු කිරීමට ප්‍රමාණවත්. ඔබට කිසිදු විධානයක් අවශ්‍ය නොවේ, යළි-යොමුවීමේ ක්‍රියාකරු පමණි.
ටර්ඩන්

2
සමහර විට, ක්‍රියා > filenameනොකරනු ඇත. උදාහරණයක් ලෙස, zsh වලින්. නමුත් : > filenameතවමත් ක්‍රියා කරයි.
CS Pei

Bash සහ sh කැමති බව පෙනේ, > myfileනමුත් උදා: csh දෝෂ: අවලංගු ශුන්‍ය විධානය.
මිර්කෝ ස්ටයිනර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.