web-dev-qa-db-ja.com

フォルダパスを繰り返さずに、別のフォルダでコマンドを実行するにはどうすればよいですか?

cdを実行せずに、コピーおよび移動操作を行うclever方法、またはファイルを複製するコマンドはありますか? mv後、同じフォルダに?

たとえば、次のコマンドを実行する必要があります。

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

ファイルの移動先のディレクトリは同じですが、パス全体を再度配置する必要があるため、煩わしい場合があります。これを行う別の方法があるかどうか知りたいですパス全体を再度配置する必要はありません。操作は同じパスで行われるためです。

73
Valter Silva

単に ブレース展開 を使用します:

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}を実行します。Bash4以降では、touch foo{0001..3}foo0001foo0002を作成するfoo0003のように、ゼロを埋め込んだシーケンスも作成できます。 Bash Hackers Wiki には、いくつかの例が掲載された記事があります。

2つの異なるコマンドを使用する必要がある場合は、最初にサブシェルとcdを使用します @ Ignacioの回答のように

125
slhck

サブシェルで操作を実行します。

( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )

作業ディレクトリの変更は、親シェルには反映されません。

賢い場合は、bash history Expansion を使用してください。

mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt

覚えるのが難しいので、自分では使いません。私は時々 vimの同等物 を使用しますが、ほとんど毎回それを調べなければなりません。

21
glenn jackman

変数を設定できます。もちろん、これには変数を残すという副作用があります。

D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt
11
sjbotha

私は他のソリューションが好きですが、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

Slhckは可能な限り最も簡単な方法で質問に直接回答しますが、Valterはautopop回答も気に入っています。

pushd /folder1/folder2/folder3/; mv file.txt file-2013.txt; popd
1