タイトルが示すように、ディレクトリとすべてのサブディレクトリを検索し、ファイル名からすべての改行を削除したいと思います。
ここで提案されている現在のソリューションは機能しません。ファイル名から改行文字を削除
これは、以下を使用したときに得られる結果です。
$ 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
)の代わりに、ベースのバリエーション(時々呼び出される)のrename
1つを使用する必要があります。prename
util-linux
rename.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
- ベースのアプローチとは異なり、ファイル名に有効な文字を形成しない一連のバイトが含まれていても動作し続けます。競合が検出されると、何もせずに終了します。)