同じフォルダでcd
をした後にmv
をしなくても、コピー&ムーブ操作やファイルを複製するコマンドを行う賢い方法はありますか?
例えば、以下のように実行する必要があります
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
ちなみに、ファイルを移動させるディレクトリは同じなのですが、もう一度全体のパスを入れ直さなければならず、たまにイライラすることがあります。同じパスでの操作になってしまうので、パスを全部入れ直さなくてもいい方法があるかどうか知りたいです
73 Valter Silva 2013-05-17
ブレース拡張を使用するだけです
mv /folder1/folder2/folder3/{file.txt,file-2013.txt}
これは文章を書くことに相当します
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
中括弧展開では、もちろん、より多くの引数を与えることができます。例えば、いくつかのテストフォルダを作成するには mkdir test_{a..z}
を実行し、Bash 4 からは touch foo{0001..3}
で foo0001
, foo0002
, foo0003
を作成するように、ゼロパッドシーケンスを作成することができます。Bash Hackers Wiki にいくつかの例を紹介した記事があります
2つの異なるコマンドを使用する必要がある場合は、サブシェルを使用して、最初にそこにcd
を使用して、@Ignacioさんの回答のように、
125 slhck 2013-05-17
サブシェルで操作を実行します
( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )
作業ディレクトリの変更は親シェルには伝わりません
74 Ignacio Vazquez-Abrams 2013-05-17
巧妙にしたいのであれば、歴史の展開をバッシュしましょう
mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt
私は記憶するのが不可能だと思うので、私自身はこれを使わないでしょう。私はたまにvim equivalentを使っていますが、ほとんど毎回調べなければなりません
21 glenn jackman 2013-05-17
変数を設定することができます。もちろんこれは変数を残しておくという副作用があります
D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt
11 sjbotha 2013-05-17
他の解決策も好きですが、ここではbash配列、pushd、popdを使ってスクリプトとして実装しています
#!/bin/bash
set -e
# from http://stackoverflow.com/a/246128/178651
script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# paths relative to the script
relative_paths=( \
path1 \
path2 \
path3 \
path4
)
for relative_path in "${relative_paths[@]}"
do
pushd "$script_path/$relative_path" > /dev/null 2>&1
pwd
mv filename1 filename2
# could do other stuff in this directory...
popd > /dev/null 2>&1
done
pushd "$script_path" > /dev/null 2>&1
# could do other stuff in same directory as script...
popd > /dev/null 2>&1
2 Gary S. Weaver 2013-05-17
Slhckが直接、可能な限りシンプルな方法で質問に答えてくれていますが、Valterもオートポップの答えが好きなので、ここでは同じ線上にあるものを紹介します
pushd /folder1/folder2/folder3/; mv file.txt file-2013.txt; popd
1 Isaac Rabinovitch 2013-05-21