linux – フォルダパスを繰り返さずに別のフォルダでコマンドを実行するには?

bash command-line linux script shell

同じフォルダで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


タイトルとURLをコピーしました