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する必要はありません。
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
をドロップすると、名前を効果的に変更できます。
コマンド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/ にあります。
@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
ノート:
mymv
は、任意の適切な文字列にすることができます。「my move」にはmymvを使用しました。別のもの:
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が失敗した場合に備えて間違いなく優れています。
1回限りの場合、現在のディレクトリを変更しない場合は、サブシェルを使用するだけです。
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
サブシェル内でcd
を使用しているため、実際のシェルでディレクトリを変更していません
私はただやる
cd dir1/dir2/dir3/
mv file.txt file.txt.old
cd ~- # go to the most recent directory
mv
コマンドを短くするためにサブディレクトリに入りたいが、後で現在のディレクトリに戻りたい場合は、2つの方法があります。 1つは、cd
とmv
をサブシェルに配置することです(既に提案されています)。
もう1つは、pushd
およびpopd
を使用してディレクトリを変更することです。
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
pushd
コマンドはcd
に似ていますが、最初に現在のディレクトリの名前をスタックにプッシュする点が異なります。 popd
は、スタックからトップネームを削除し、そのディレクトリに移動します。
関係するソリューション: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"