ファイル名から改行文字を繰り返し削除します。

ファイル名から改行文字を繰り返し削除します。

タイトルが示すように、ディレクトリとすべてのサブディレクトリを検索し、ファイル名からすべての改行を削除したいと思います。

ここで提案されている現在のソリューションは機能しません。ファイル名から改行文字を削除

これは、以下を使用したときに得られる結果です。

$ 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' '{}' * \;

エラーメッセージは生成されませんが(コマンドのみを受け入れます)、サブディレクトリのファイル名は変更されません。

答え1

のバリエーション(時々呼び出されるperl)の代わりに、ベースのバリエーション(時々呼び出される)のrename1つを使用する必要があります。prenameutil-linuxrename.ul

fromはutil-linuxはるかに制限的であり(はるかに新しいものですが)、他の構文を使用して固定文字列のみを置き換えることができ、文字列内のすべての項目を置き換えることはできません。

renameここでは、ファイル名の改行のみが変換され、改行を引き起こすディレクトリコンポーネントは変換されず、分岐前-depthのリーフを処理するために使用されるPerlバリアントを使用します。

perl改行文字として認識されるので、コード引数を\n使用する必要はありません$'...'(もちろん私が最初に考えたものとは逆にしても大丈夫です)。

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

または、使用可能な場合は使用します(これにより、-execdirファイルがあるすべてのディレクトリで少なくとも1つが実行されますが)。rename\n

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

zshまたは、次のものを使用できますzmv

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

find- ベースのアプローチとは異なり、ファイル名に有効な文字を形成しない一連のバイトが含まれていても動作し続けます。競合が検出されると、何もせずに終了します。)

答え2

rename提供されるコマンドは、util-linuxリンクされた回答で提供されるコマンドと使用法が異なります。特に、単一のsedスタイルの代替コマンドではなく、別々のパラメータがfrom必要なため、エラーメッセージが表示されます。tonot enough arguments

SYNOPSIS
       rename [options] expression replacement file...

したがって、この場合は次のものが必要です。

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

また見なさい:

簡単な使用量比較を行う

関連情報