ディレクトリのファイル名からスペースを削除する

ディレクトリのファイル名からスペースを削除する

something .pdf代わりに、いくつかのファイル名が正しく指定されていないディレクトリがありますsomething.pdf。ファイル名からスペースを削除するために使用できる簡単な方法はありますか?

頑張りましたfind -name "* .pdf" -type f | rename 's/ //g'

しかし、それはうまくいきませんでした。

答え1

zshでは、次のコマンドを使用して簡単に実行できます。zmv機能。autoload -U zmvyoursと入力する~/.zshrcか、シェルで一度実行してから、次の操作を行います。

zmv '* .pdf' '${f// /}'

これにより、ファイル名のすべてのスペースが削除されます。.pdf拡張前にアイテムのみを削除する場合:

zmv '* .pdf' '${f# .pdf}.pdf'

または、逆参照として使用できるグループを区切るには、括弧を使用してください。

zmv '(*) .pdf' '$1.pdf'

サブディレクトリでも操作を実行するには、次の手順を実行します。

zmv '**/* .pdf' '${f# .pdf}.pdf'

(**/)または(代わりに使用する必要があります(**)/):

zmv '(**/)(*) .pdf' '$1$2.pdf'

Linuxでzshの有無にかかわらず、ファイル名に次のような誤った空白がある場合:

rename \ .pdf .pdf *\ .pdf

または、元の名前にスペースが1つしかない場合:

rename ' ' '' *\ .pdf

サブディレクトリでも作業したい場合は、ksh93≥o +またはbash≥4で**サブディレクトリのファイルを一致させるために使用できます。 Bashでは、まずksh93をshopt -s globstar実行し(この行をに入力する必要があります~/.bashrc)。set -o globstar

rename \ .pdf .pdf **/*\ .pdf

bashはディレクトリに再帰するときにシンボリックリンクに従います。

利点がない場合は、再帰を**使用できますfind

find . -name '* .pdf' -exec rename ' .pdf' .pdf {} +

Debianとその派生製品(Ubuntuを含む)とほとんどの非Linuxシステムでは、コマンドはperl置換renameされる文字列と置換文字列の代わりにPerl式を引数として使用するという点で異なります。rename.ul上記のコマンド(Debianとその派生から)またはPerlと一緒に使用してくださいrename

rename 's/ \.pdf$/.pdf/' -- *\ .pdf    # strip the space before the extension
rename 's/ //g' -- *\ .pdf             # strip all spaces

答え2

これにより、誤って上書きされるのを防ぐことができます(重要な場合)。

IFS=$'\n'
for i in $(find . -name '* .pdf')
do
  mv -i "$i" "${i% .pdf}.pdf"
done

対話式シェルでこのコマンドを実行している場合は、IFSを変更した直後に終了できます。

関連情報