Rename
遞歸刪除文件名中的換行符
正如標題所暗示的,我想掃描一個目錄和所有子目錄並從文件名中刪除所有換行符。
此處提出的目前解決方案不起作用:刪除文件名中的換行符
這是我使用它時得到的:
$ 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
您連結的答案中給出的不同。特別是,它需要一個單獨的from
和to
參數,而不是單個 sed 樣式的替換命令——因此是錯誤消息not enough arguments
。SYNOPSIS rename [options] expression replacement file...
所以在這種情況下你需要
find . -name $'*\n*' -exec rename $'\n' ' ' {} \;
也可以看看:
並進行簡單的使用比較
確保使用
perl
基於- 的rename
變體之一,有時稱為prename
,而不是 fromutil-linux
(有時稱為rename.ul
)。一個 from
util-linux
受到更多限制(儘管更新得多),使用不同的語法,只能替換固定字元串並且不能替換所有出現的字元串。在這裡,我將使用 perl
rename
變體,確保只轉換文件名中的換行符,而不是導致它們的目錄組件,並用於-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
’szmv
:autoload zmv NL=$'\n' zmv "(**/)(*$NL*)(#qD)" '$1${2//$NL/ }'
(與
find
基於 - 的方法相反,即使文件名包含不形成有效字元的字節序列,它仍然可以工作。如果它檢測到衝突,它也會在不做任何事情的情況下退出)。