cd
を実行せずに、コピーおよび移動操作を行うclever方法、またはファイルを複製するコマンドはありますか? mv
後、同じフォルダに?
たとえば、次のコマンドを実行する必要があります。
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
ファイルの移動先のディレクトリは同じですが、パス全体を再度配置する必要があるため、煩わしい場合があります。これを行う別の方法があるかどうか知りたいですパス全体を再度配置する必要はありません。操作は同じパスで行われるためです。
単に ブレース展開 を使用します:
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}
、foo0001
、foo0002
を作成するfoo0003
のように、ゼロを埋め込んだシーケンスも作成できます。 Bash Hackers Wiki には、いくつかの例が掲載された記事があります。
2つの異なるコマンドを使用する必要がある場合は、最初にサブシェルとcd
を使用します @ Ignacioの回答のように 。
サブシェルで操作を実行します。
( 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の同等物 を使用しますが、ほとんど毎回それを調べなければなりません。
変数を設定できます。もちろん、これには変数を残すという副作用があります。
D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt
私は他のソリューションが好きですが、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
Slhckは可能な限り最も簡単な方法で質問に直接回答しますが、Valterはautopop回答も気に入っています。
pushd /folder1/folder2/folder3/; mv file.txt file-2013.txt; popd