ディレクトリ名からキャリッジリターンを削除するには?

ディレクトリ名からキャリッジリターンを削除するには?

Excelでファイルを作成し、そのファイルをLinuxコンピュータにftpに送信しました。ファイルには多くのコマンドがありますmkdir。新しく作成されたすべてのディレクトリに、最後にキャリッジリターン文字があります。以下を使用してディレクトリを見つけることができます。

find . -type d -name *$'\r'

ただし、次のコマンドを使用して削除しようとすると、次のようになります。

find . -type d -name *$'\r' | xargs rm-rf

動作しません。何も削除されません。ディレクトリはまだ存在し、まだキャリッジリターンがあります。

不快な「\r」を削除するコマンドを作成するのに役立ちますか?ありがとうございます。

PS:私はRHEL 5.3を使用しています。

答え1

Linuxrenameこのコマンドを使用すると、これが簡単になります。

rename $'\r' '' *

$'\r'現在のディレクトリ内のすべてのファイル名の最初で唯一のキャリッジリターン文字()を空の文字列()に置き換えます。キャリッジリターンを含まない名前は変更されません。または、名前を変更する必要があると見なされるファイルのみを書き込む''ことができます。rename $'\r' '' *$'\r'

サブディレクトリのファイルにも作業が必要な場合:

shopt -s globstar
rename $'\r' '' **/*$'\r'

(Debian、Ubuntu、およびその派生製品のユーザー:renameに変更するrename.ulrename $'\r' ''、に変更しますrename 's/\r//'。)

代わりにzshを使用してくださいzmv機能:

zmv $'**/*\r' "${f%?}"

答え2

編集:sed行で\ rを2回エスケープすることを忘れました。

そのうちの1つがあなたに適しています

for i in $(find . -type d -name '*\r'); do mv "$i" "$(echo $i | sed -e 's/\\r//g')"; done

find . -type d -name '*\r' -exec mv "{}" "$(echo {} | sed -e 's/\\r//g')" \;

現在のディレクトリの下に* $ \ rという名前のすべてのディレクトリを見つけます。

次に、mv\ rを引いた同じ名前に名前を変更します。

答え3

この試みfind . -type d -name *$'\r' -exec rm -rf '{}' \;

関連情報