ディレクトリ内のすべてのファイル名からアポストロフィを削除しようとしました。
for i in *; do mv $i `echo $i | tr -d "'"`; done
このコマンドを実行すると、名前は変更されません。
ここで何が悪いのか知っていますか?
次のようなものを試すことができます(bash
):
shopt -s nullglob
for i in *\'* ; do mv -v "$i" "${i/\'/}" ; done
これはシェル文字列置換を使用します。 mv
が失敗するため、'
が含まれていないファイルをグロブ処理したくない場合があります。 nullglob
オプションがない場合、一致するファイルがない場合、グロブパターン自体がmv
に渡されます。
常に変数の置換_$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、その他の派生物では、 rename
Perlスクリプトを使用できます。
_rename "s/'//g" *
_
あなたの問題は、ファイルの名前にもスペースが含まれていることです。それなしではエラーを再現できません。
$ 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
したがって、3つのファイル(user's
、file
、users
)、およびこれらのファイルを(file
)に移動するディレクトリ。
両方を適切に引用することで、差し迫った問題を解決できます
$ for i in ./*; do mv "$i" "$(echo "$i" | tr -d "'")"; done