Rename

遞歸刪除文件名中的換行符

  • September 10, 2020

正如標題所暗示的,我想掃描一個目錄和所有子目錄並從文件名中刪除所有換行符。

此處提出的目前解決方案不起作用:刪除文件名中的換行符

這是我使用它時得到的:

$ find -name $'*\n*' -exec rename $'s|\n| |g' '{}' \; 
rename: not enough arguments 
Try 'rename --help' for more information.

如果我添加一個*

$ find -name $'*\n*' -exec rename $'s|\n| |g' '{}' * \;

這不會產生任何錯誤消息(只接受命令),但不會重命名子目錄中的文件

rename提供的命令的用法與util-linux您連結的答案中給出的不同。特別是,它需要一個單獨的fromto參數,而不是單個 sed 樣式的替換命令——因此是錯誤消息not enough arguments

SYNOPSIS
      rename [options] expression replacement file...

所以在這種情況下你需要

find . -name $'*\n*' -exec rename $'\n' ' ' {} \;

也可以看看:

並進行簡單的使用比較

確保使用perl基於- 的rename變體之一,有時稱為prename,而不是 from util-linux(有時稱為rename.ul)。

一個 fromutil-linux受到更多限制(儘管更新得多),使用不同的語法,只能替換固定字元串並且不能替換所有出現的字元串。

在這裡,我將使用 perlrename變體,確保只轉換文件名中的換行符,而不是導致它們的目錄組件,並用於-depth在分支之前處理葉子。

perl辨識\n為表示換行符,因此您不需要使用$'...'它的程式碼參數(儘管如果您與我最初的想法相反,這很好)。

find . -depth -name $'*\n*' -exec rename '
 s{[^/]*\z}{$& =~ y/\n/ /r}e' '{}' +

或使用(如果可用)(儘管每個目錄-execdir至少執行一個文件,其中包含文件):rename``\n

find . -depth -name $'*\n*' -execdir rename 'y/\n/ /' {} +

或者你可以使用zsh’s zmv

autoload zmv
NL=$'\n'
zmv "(**/)(*$NL*)(#qD)" '$1${2//$NL/ }'

(與find基於 - 的方法相反,即使文件名包含不形成有效字元的字節序列,它仍然可以工作。如果它檢測到衝突,它也會在不做任何事情的情況下退出)。

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