すべてのファイル名からアポストロフィを削除する

すべてのファイル名からアポストロフィを削除する

ディレクトリ内のすべてのファイル名からアポストロフィを削除してみました。

for i in *; do mv $i `echo $i | tr -d "'"`; done

このコマンドを実行した後、名前は変更されません。

ここで何が問題なのかご存知ですか?

答え1

次のように試すことができます(bash)。

shopt -s nullglob
for i in *\'* ; do mv -v "$i" "${i/\'/}" ; done

これはシェル文字列置換を使用します。'含まれていないファイルは失敗する可能性があるため、使用したくありませんmv。このオプションがない場合、一致するファイルがない場合はnullglobglobパターン自体が渡されます。mv

答え2

$foo変数の置換とコマンドの置換には常に二重引用符を使用してください。$(foo)(該当する項目を除外する理由と、それを実行できる理由を知らない場合)

for i in *; do mv "$i" "$(echo "$i" | tr -d "'")"; done

これは基本的には機能しますが、いくつかの制限があります。

  • ファイル名がで始まるとオプションとして解釈されるため、-誤った動作やエラーが発生します。mv
  • で終わる名前には影響しません.
  • echo一部の設定では、コマンドでバックスラッシュが破棄されます。
  • 名前の末尾の改行は失われます。

ksh93、bash、zshでは、この構文を使用してこのコードを簡単に記述できます${VARIABLE//PATTERN/REPLACEMENT}--に追加すると。mvが処理されます-。ファイル名が.。で始まる場合は、.*必要に応じて後ろまたはを追加してください。.[^.]* ..?**

for i in *; do mv -- "$i" "${i//\'/}"; done

zshでは利用可能ですzmv:

zmv '(*)' "\${1//\\'/}"

Debian、Ubuntu、その他の派生製品で使用できます。renamePerlスクリプト。

rename "s/'//g" *

答え3

あなたの問題は、ファイル名にもスペースがあることです。それがなければエラーを再現することはできません。

$ touch "file" "user's file"
$ for i in *; do mv $i `echo $i | tr -d "'"`; done
mv: `file1' and `file1' are the same file
mv: target `file' is not a directory

したがって、失敗した理由は2番目のメッセージですtarget 'file' is not a directory

forループで空白のあるファイルを見つけたら、次のようにします。

mv user's file users file

user'sしたがって、3つのファイル(、fileおよびusers)とそのファイルを移動するディレクトリ()を指定したと思いますfile

両方を正しく引用すると、すぐに問題が解決します。

$ for i in ./*; do mv "$i" "$(echo "$i" | tr -d "'")"; done

関連情報