Linux

是否有一個 Linux 命令只刪除每個文件的第一個字元?

  • February 13, 2022

是否有一個Linux命令可以刪除文件夾中每個文件第一行的第一個字元,然後保存?

許多線上資源包括為每一行而不是第一行、文件名執行此操作,或者它們不保存文件。我嘗試修改其中一個命令來執行我想要的操作,但實際上它使文件變為空白。

如果您有GNU sed

find PATH -type f -exec sed -s -i '1s/.//' \{} +

要刪除目前工作目錄中或之下的每個非空正常文件的第一個字元¹,在zshshell 中,您可以執行以下操作:

zmodload zsh/mapfile
for file (**/*(ND.L+0)) mapfile[$file]=${mapfile[$file]#?}

請注意,在第一行為空的特殊情況下(文件以換行符開頭),這與刪除第一行的第一個字元並不完全相同。在這種情況下,上面刪除了換行符,這意味著刪除了第一行(空)。如果您不想這樣,您可以將?(匹配任何字元)替換[^$'\n']為匹配除換行符以外的任何字元。

請注意,由於這最終會將整個文件載入到記憶體中,因此您不希望在非常大的文件上執行此操作。

一種對記憶體更友好但仍會在原地重寫原始文件並保留其所有元數據(而不是sed -i用修改後的副本替換文件)的方法可能是:

find . -name '*.jpg' -size +0 -exec ksh93 -c '
 builtin cat
 for file do
   { IFS= read -rN1 && cat; } < "$file" 1<>; "$file"
 done' ksh93 {} +

這次我們使用ksh93<>;重定向運算符,它以讀寫模式打開文件(最初沒有截斷),並且僅在該命令成功時退出重定向命令時截斷它。在這裡,命令是一個命令組,它從標準輸入中讀取一個字元並將其丟棄,然後將其標準輸入的其餘部分寫入標準輸出。

請注意,如果文件名的其餘部分可以在目前語言環境中解碼為字元,則GNU find(與 相反zsh)將找不到名稱以 結尾的文件。.jpg


¹ 或第一個字節用於那些以無法解碼為語言環境字元編碼中的字元的文件開頭的文件。比較sed '1s/.//'哪個會刪除可以這樣解碼的第一個字元,所以不一定在文件的開頭,或者sed '1s/^.//'如果第一行有一個字元,它將刪除第一行開頭的第一個字元,否則什麼也不做

引用自:https://unix.stackexchange.com/questions/677537