タイトルが示すように、ディレクトリとすべてのサブディレクトリを検索し、ファイル名からすべての改行を削除したいと思います。
ここで提案されている現在のソリューションは機能しません。ファイル名から改行文字を削除
これは、以下を使用したときに得られる結果です。
$ 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
- ベースのアプローチとは異なり、ファイル名に有効な文字を形成しない一連のバイトが含まれていても動作し続けます。競合が検出されると、何もせずに終了します。)
答え2
rename
提供されるコマンドは、util-linux
リンクされた回答で提供されるコマンドと使用法が異なります。特に、単一のsedスタイルの代替コマンドではなく、別々のパラメータがfrom
必要なため、エラーメッセージが表示されます。to
not enough arguments
SYNOPSIS
rename [options] expression replacement file...
したがって、この場合は次のものが必要です。
find . -name $'*\n*' -exec rename $'\n' ' ' {} \;
また見なさい:
- Debian / Ubuntuの名前変更ユーティリティがCentOSなどの他のディストリビューションの名前変更ユーティリティと異なるのはなぜですか?
- 名前の変更、名前の変更、ファイルの名前変更など、すべての名前変更操作はどうなりますか?
簡単な使用量比較を行う