web-dev-qa-db-ja.com

長い名前のLinux mvファイル

Linuxでは、次のようにファイルの名前を変更することがあります。

mv dir1/dir2/dir3/file.txt  dir1/dir2/dir3/file.txt.old

別のディレクトリに移動するのではなく、ファイルの名前を変更したいことに注意してください。

そのコマンドの簡略版を実行できるコマンドはありますか?私は次のようなものを考えています:

mv dir1/dir2/dir3/file.txt  file.txt.old

または多分(名前に追加するだけ):

mv dir1/dir2/dir3/file.txt  {}.old

私の目標は、完全なパスを再度指定する必要がないことです。

私が書いたこれらの「例」が機能しないことはわかっていますが、それは私が達成したいことのアイデアにすぎません。

ディレクトリにcdする必要はありません。

19
santiago arizti

1つのファイルを試す

mv dir1/dir2/dir3/file.{txt,txt.old}

X{a,b}構成要素がXa Xbに展開される場所で、次のコマンドを使用してプレビューできます。

echo dir1/dir2/dir3/file.{txt,txt.old}

それがあなたのニーズに合っているかどうかを確認します。

注意:

  1. 複数のファイルの場合

    mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
    

あなたが望むものに拡張することはほとんどありません。 (これは、file.txt file1.txt.old file2.txtの混合に展開されます...)

  1. コメントに従って、{txt,txt.old}{,.old}に短縮できます。

  2. ディレクトリ名が明確な場合は、ワイルドカードを使用できます。

    mv *1/*2/d*/*.{,old}
    

複数のファイルを使用する場合はrename

rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt 

-nをドロップすると、名前を効果的に変更できます。

45
Archemar

コマンドrenameは、一致したすべてのファイルの名前を変更します。その主な目的は複数のファイルの名前を変更することですが、Perl式が1つのファイルのみに一致する場合、この単一のファイルのみの名前を変更します。詳細およびディストリビューション固有の構文については、マンページをご覧ください:man rename

使用例:「/path/file.txt」の名前を「/path/file.txt.old」に変更します。

rename 's/file.txt/file.txt.old/g' /path/file.txt

より短い表記(shalombに感謝):

rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt

予行演習ではrename -n

その他の例と詳細は https://thepcspy.com/read/bulk-rename-files-in-ubuntu/ にあります。

6
Fabian

@archemarの{}拡張を使用したソリューションが気に入っています。これは、コマンドラインをすでに起動しているときに使用できるためです。完全性のための他の可能性は次のとおりです。

F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"

(名前にスペースまたはその他の改行文字が含まれている場合にのみ、引用符が必要です)

mymv() {
    mv "$1/$2" "$1/$3"
}

mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old

ノート:

  • これはbash構文です。別のシェルを使用している可能性があります
  • mymvは、任意の適切な文字列にすることができます。「my move」にはmymvを使用しました。
  • 関数定義は.bash_profileに置くことができます

別のもの:

cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -

だが

(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)

(@Adamおよび@CharlesDuffyから)は、CDが失敗した場合に備えて間違いなく優れています。

4
Law29

1回限りの場合、現在のディレクトリを変更しない場合は、サブシェルを使用するだけです。

(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)

サブシェル内でcdを使用しているため、実際のシェルでディレクトリを変更していません

4
Adam

私はただやる

cd dir1/dir2/dir3/
mv file.txt file.txt.old
cd ~- # go to the most recent directory
2
glglgl

mvコマンドを短くするためにサブディレクトリに入りたいが、後で現在のディレクトリに戻りたい場合は、2つの方法があります。 1つは、cdmvをサブシェルに配置することです(既に提案されています)。

もう1つは、pushdおよびpopdを使用してディレクトリを変更することです。

pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd

pushdコマンドはcdに似ていますが、最初に現在のディレクトリの名前をスタックにプッシュする点が異なります。 popdは、スタックからトップネームを削除し、そのディレクトリに移動します。

2
AndyB

関係するソリューション:mv something{.txt,.txt.old}は「バシズム」を使用しています。よりポータブルな方法が必要な場合は、一般的な変数操作を使用します。

# rename all files "file*.txt" of directory /dir1/dir2/dir3 into file*.txt.old:
for f in dir1/dir2/dir3/file*.txt ; do
  mv "$f" "${f/.txt/.txt.old}"  # note there are no terminating "/"
done


# "${var/A/B}" is the content of var with the first occurence of "A" replaced by "B"
0
Olivier Dulac