Comment exécuter des commandes dans un autre dossier, sans répéter le chemin du dossier?

Existe-t-il une façon intelligente de copier et déplacer des opérations ou une commande pour dupliquer un fichier, sans avoir à faire un cd , puis mv après, dans le même dossier?

Par exemple, je dois exécuter ce qui suit:

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

Notez que le répertoire vers lequel je déménage le fichier est le même, mais je dois repasser le chemin d'accès complet et parfois il devient ennuyeux. Je suis curieux de savoir s'il y a une autre façon de le faire sans avoir à remettre le chemin complet , car l'opération se fera dans le même chemin.

Il suffit d'utiliser l' extension de l'accolade :

 mv /folder1/folder2/folder3/{file.txt,file-2013.txt} 

Cela équivaut à l'écriture:

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

L'expansion de Brace vous permet de fournir plus d'arguments, bien sûr. Vous pouvez même passer des plages, par exemple pour créer un couple de dossiers de test, vous pouvez exécuter mkdir test_{a..z} et, en commençant par Bash 4, vous pouvez également créer des séquences mkdir test_{a..z} zéro, en touch foo{0001..3} , qui crée foo0001 , foo0002 et foo0003 . The Bash Hackers Wiki a un article avec quelques exemples pour vous.

Si vous devez utiliser deux commandes différentes, utilisez un sous-ensemble et un cd là-bas d'abord, comme dans la réponse de @ Ignacio .

Exécutez l'opération en sous-système.

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

Le changement de répertoire de travail ne sera pas propagé sur le shell parent.

Si vous voulez intelligent, voici l'évolution de l' histoire de bash

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

Je ne voudrais pas utiliser cela moi-même car je trouve impossible de mémoriser. J'utilise occasionnellement l' équivalent vim , mais je dois le chercher presque chaque fois.

Vous pouvez définir une variable. Bien sûr, cela a l'effet secondaire de laisser les variables autour.

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

J'aime les autres solutions, mais voici une autre, mise en œuvre sous la forme de script avec bash arrays, 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 répond directement à la question de la manière la plus simple possible, mais Valter aime aussi la réponse autoptop, alors voici une qui est dans le même sens;

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