Unix:ダッシュで始まるファイル-


19

OK、ダッシュで始まるファイルがたくさんあります-。それはあまり良くありません...そして私はそれらの名前を変更したいです。私の特定のケースでは、彼らの前にキャラクターを置きたいだけです。

動作するはずの次の行を見つけましたが、ダッシュのために動作しません。

for file in -N*.ext; do mv $file x$file; done

echoを前に置くと、mvたくさんの

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

当然ですが、最初のファイル名はオプションであると考えられます。だから私はechoそれを削除して実行すると、私はただの束を得る

mv: illegal option -- N

私はそれを変更しようとしました

for file in -N*.ext; do mv "$file" "x$file"; done

しかし、引用符は無視されているようです。一重引用符を使用しようとしましたが、変数は展開されませんでした...ここで何をしますか?

更新:引用を引用するようになりました。このような:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

それをエコーすると、正しく見えますが、実際に実行すると、

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

どうやったらいいかわからない... ため息


回答:


28

キーワードを使用して、引数がオプションとして解釈されないことをmvコマンド--に伝える必要があります。時計:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

コマンドラインのすべてのオプションの-- 後に使用します。あなたが使用しようとしている場合などは、-iへのオプションのMVを、それが行くだろう前に --

mv -i -- -filename-begins-with-dash newfilename

6
ああ。それについてはまったく考えませんでした。それまでの間./、ファイル名の前にも貼り付けることができることがわかりました。しかし、これは当然のことながらも、すっきりオプション:)である
Svish

@Svish:それは公平です、私はファイル名の./どちらかを前に付けることを考えませんでした。しかし、あなたは正しいです、それはこの状況でも機能します。
いんちきのキホーテ

7
--オプションは慣習であり、すべてのプログラムで尊重されないため、意味はそれ以上の引数を処理しないことに注意してください。そのために孤独な人もいれ、その目的のために何も-受け入れない人もいます。したがって、先頭に追加することは覚えておく価値があります。./
dmckee

@dmckeeは正しいです。--特別な引数はGNU拡張機能ですが、POSIXガイドラインで言及されています。セクション12.2、ガイドライン10を参照してください:opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ...これは、ほとんどのPOSIXおよびGNUユーティリティが規則を尊重することを期待できるが、そうでない場合もあることを意味します。
いんちきキホーテ

6

別の手法は、親ディレクトリをファイル名に含めることです...

ファイルの名前を「-file-to-rename」から「file-to-rename」に変更するには...

mv  ../parent-dir/-file-to-rename  file-to-rename

ありがとう@Skippy le Grand Gourou。./-file-to-renameがで動作することを確認したmvrmのように...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename

1
または、キホーテの答えを偽装するコメントで既に述べたように、を使用してください./
スキッピールグラングロウ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.