ディレクトリパスを再入力せずにファイルの名前を変更する最も簡単な方法


56

Unixでファイルの名前を変更する方法を知っています。

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

~/folder/subfolder/file2回繰り返すには時間がかかりすぎます。

もっと速い方法はありますか?

回答:


104

あなたのシェルがいる場合、サポート ブレース展開を(と連携しcshtcshkshzshbashmkshlkshpdkshyashブレース-拡大呼び出すことによって有効yash --brace-expandかと対話型のシェルで設定set -o brace-expand、またはfish):

mv ~/folder/subfolder/file.{txt,sh}

4
シンプルが最高!
ブライアム

2
素晴らしいシェルでの拡張の素晴らしい使用!
harish.venkat

3
それ素晴らしいですが、本当に不可解です。それは動作しますが、一見すると、何か違うことをしていると思います:2つのファイルをどこかに移動します。特にを使用したはるかに優れたソリューションがあるため、これは素晴らしいアイデアではないと思いますrename
yo

4
@tohecz:なぜ謎めいていますか?これはシェルの機能であり、誰でもシェルのマニュアルページを読むことでそれを知ることができます。また、既存のファイルを上書きするかどうかを尋ねないrenameため、より良い解決策とは思いrenameません。
cuonglm

1
@Gnoucあなたは男だ。
開始者14

20

rename(util-linuxパッケージの一部)を使用することもできます。

rename .txt .sh ~/folder/subfolder/file.txt

詳細については、manページ名前変更を参照してください。


+1これは、シェルの{a,b}機能に依存するよりもはるかに優れた方法です。
yo

5
一部のLinuxディストリビューション(Ubuntuなど)ではrename、perlベースのまったく異なるプログラムです。そこでは、を使用しますrename 's/txt$/sh/' ~/folder/subfolder/file.txt
evilsoup 14年

Debian(およびUbuntu)にもありますmmv
ctrl-alt-delor

10

上記はすべて良いです。これも動作します:

( cd ~/folder/subfolder && mv file.txt file.sh )

いいえ、私にはうまくいきません!
ハメドカムラバ

sudo部品を取り外しても機能します。
クトゥルフ

1
@Cthulhuはい、そうです。しかし、なぜ動作しないのsudoですか?
ハメドカムラバ

2
@HamedKamravaおそらく、ルートのホームディレクトリとしてsudo解釈さ~れるためです。
クトゥルフ

できますがsudo、できmvませんcd。CDを内蔵シェルである理由を参照してください。そして、あなたがすることはできません。sudo(
Ctrl + Alt + delor

6

いいえ。ファイル名を変更するには、ファイルへのフルパスを指定する必要があります。唯一の選択肢は、実行する前にターゲットフォルダに移動することmvです:

cd ~/folder/subfolder/
mv file.txt file.sh

または、ターゲットディレクトリのファイルの名前を変更する小さな関数を作成することもできます。たとえば、次の行をシェル初期化ファイルに追加します(~/.bashrc使用している場合bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

次に、新しいターミナルを開くか、単に実行source ~/.bashrcしてinitファイルを再読み取りします。

lmv ~/folder/subfolder/file.txt file.sh

lmv()機能の場合は+1 。私はそれを知りませんでした:)
ハメドKamrava

1
@HamedKamrava誰もそれを知りませんでした。私はそれを書いたばかりですが、それは標準的なものではありません。
テルドン

2
知っている。自分の関数を書くことができるとは知らなかったのです!
ハメドカムラバ

2

cuonglmの答えの有用性を拡張するだけで(私は彼の解決策が好きなので、信用を得ることはありません)、彼の答えは正しいものです。

ユースケースは、/ folder / subfolder / configFile.dat TO configFile.dat.origのように、しばしばリモートの場所にファイルをmvしたいということです(実際の問​​題)。

この形式のコマンドは、ファイル拡張子を追加します(元の拡張子を置き換えません)

mv ~/folder/subfolder/file.txt{,.orig}

説明:「{、.orig}」は、ファイル名の末尾の(なし)を(何か)「.orig」に置き換えることを意味します

または、ファイル拡張子削除します(名前変更を元に戻します

mv ~/folder/subfolder/file.txt{.orig,}

注:「dirパスを再入力せずにファイルの名前を変更する最も簡単な方法」のトピックは引き続き


1

はい。使用する場合は、使用bashしますsudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd

これは実際にはもっと大きく、元のディレクトリへのアクセス許可を失った場合に失敗する可能性がありpopdます。


1
ポイントは何だpushdpopdここでは?これはどのように優れていcd ~/folder/subfolder/ && sudo mv file.txt file.shますか?
テルドン

1
ポイントは、サブフォルダーではなく、開始したフォルダーに戻ってコマンドを実行することです。の代替手段pushd popdは、を使用cdして戻ることcd -です。
ジョフェル

質問者は、作業ディレクトリを変更しないという意図を述べているようで、利用可能な場合popdは、よりも優れていcd ../../ます。
41754

7
(cd /path/to/there && mv x y)その後使用(サブシェルを使用)
ステファンシャゼル

あなたは本当にsudo前に置くべきではありませんpushd。したがって、完全なコマンドはである必要がありますpushd ...dir && sudo mv old new && popd。別の方法として、(cd ...dir; sudo mv old new)サブシェルで実行するとディレクトリの変更が自動的に処理されるので、実行できます。
ミッコランタライネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.