ディレクトリ内のすべてのファイル名からアポストロフィを削除してみました。
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
。このオプションがない場合、一致するファイルがない場合はnullglob
globパターン自体が渡されます。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、その他の派生製品で使用できます。rename
Perlスクリプト。
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