web-dev-qa-db-ja.com

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

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

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

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

繰り返すのに時間がかかりすぎる~/folder/subfolder/file 2回。

より速い方法はありますか?

57
Hamed Kamrava

シェルの場合 supportedBrace Expansioncshtcshkshzshbashmkshlkshpdkshyash withbrace-expandyash --brace-expandを呼び出すか、対話型シェルでset -o brace-expandまたはfish)を呼び出すことで有効になります。

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

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

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

詳細は rename man page を参照してください。

21
jofel

上記はすべて良好です。これも機能します:

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

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

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

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

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

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

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

Cuonglmの答えの有用性を拡大するためだけに(私は彼の解決策を愛しているので信用しないでください)そして彼の答えは正しいものです。

ユースケースは、リモートの場所(実際の問​​題)にあるファイルをmvで処理したい場合がよくあります。 /folder/subfolder/configFile.dat TO configFile.dat.orig

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

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

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

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

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

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

2
spikendu

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

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

1
41754