解決策 1:
単一のファイルを試してください
mv dir1/dir2/dir3/file.{txt,txt.old}
どこで X{a,b}
Xa Xb
に展開する を使用してプレビューできます
echo dir1/dir2/dir3/file.{txt,txt.old}
ニーズに合っているかどうかを確認してください。
注:
<オール>複数のファイルの場合
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
あなたが望むものに拡張する可能性は低いです。 (これは file.txt file1.txt.old file2.txt の混合に展開されます ...)
-
{txt,txt.old}
{,.old}
に短縮できます コメント通り -
ディレクトリ名が明確な場合は、ワイルドカードを使用できます。
mv *1/*2/d*/*.{,old}
複数ファイルの場合 rename
を使用
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
-n
を削除 効果的な名前変更を行います。
解決策 2:
コマンド rename
一致したすべてのファイルの名前を変更します。その主な目的は複数のファイルの名前を変更することですが、Perl 式が 1 つのファイルのみに一致する場合は、この 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/ にあります。
解決策 3:
{} 展開を使用する @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:
1 回限りのケースとして、現在のディレクトリを変更したくない場合は、サブシェルを使用するだけです:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
あなたがcd
だから サブシェル内では、実際のシェルでディレクトリを変更していません
解決策 5:
mv
を短くするためにサブディレクトリに入りたい場合 コマンドを実行したが、後で現在のディレクトリに戻りたい場合は、2 つの方法があります。 1つは cd
を入れることです と mv
サブシェルで(すでに提案されているように)
もう1つは pushd
を使用することです と popd
ディレクトリを変更するには:
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
pushd
コマンドは cd
のようなものです ただし、最初に現在のディレクトリの名前をスタックにプッシュします。 popd
スタックから最上位の名前を削除し、そのディレクトリに移動します。