72 votes

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

Y a-t-il un astucieux un moyen de faire des opérations de copie et de déplacement ou une commande pour dupliquer un fichier, sans avoir à faire un cd alors 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éplace le fichier est le même, mais je dois remettre tout le chemin d'accès et cela devient parfois ennuyeux. Je suis curieux de savoir s'il existe un autre moyen de faire cela. sans avoir à remettre tout le chemin en place car l'opération serait effectuée dans le même chemin.

124voto

slhck Points 209720

Il suffit d'utiliser expansion de l'armature :

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

Cela revient à écrire :

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

L'extension Brace vous permet de fournir plus d'arguments, bien sûr. Vous pouvez même lui passer des plages, par exemple, pour créer quelques dossiers de test, vous pouvez exécuter mkdir test_{a..z} et, à partir de Bash 4, vous pouvez également créer des séquences avec un décalage de zéro, comme dans le cas suivant touch foo{0001..3} qui crée foo0001 , foo0002 y foo0003 . その Bash Hackers Wiki a un article avec quelques exemples pour vous.

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

74voto

Exécutez l'opération dans un sous-shell.

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

Le changement de répertoire de travail ne sera pas propagé au Shell parent.

21voto

Abbas Points 3737

Si vous voulez de l'intelligence, voici bash expansion de l'histoire

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

Je ne l'utiliserais pas moi-même car je le trouve impossible à mémoriser. J'utilise de temps en temps le équivalent vim mais je dois le vérifier presque à chaque fois.

11voto

dvim Points 151

Vous pouvez définir une variable. Bien sûr, cela a pour effet secondaire de laisser les variables en place.

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

2voto

Wyzard Points 466

J'aime les autres solutions, mais en voici une autre, implémentée comme un script avec des tableaux 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X