Donc, si je suis dans mon répertoire personnel et que je souhaite déplacer foo.c vers ~ / bar / baz / foo.c, mais que ces répertoires n'existent pas, existe-t-il un moyen de créer automatiquement ces répertoires, de sorte que il suffit de taper
mv foo.c ~/bar/baz/
et tout irait bien? Il semble que vous pouvez alias mv vers un simple script bash qui vérifierait si ces répertoires existaient et sinon appelait mkdir puis mv, mais j'ai pensé que je vérifierais si quelqu'un avait une meilleure idée.
Réponses:
Que diriez-vous de ce one-liner (en bash):
Décomposer cela:
crée le répertoire (y compris tous les répertoires intermédiaires), après quoi:
déplace le fichier vers ce répertoire ($ _ se développe jusqu'au dernier argument passé à la commande shell précédente, c'est-à-dire: le répertoire nouvellement créé).
Je ne sais pas jusqu'où cela fonctionnera dans d'autres coquilles, mais cela pourrait vous donner quelques idées sur ce qu'il faut rechercher.
Voici un exemple utilisant cette technique:
la source
./
partout? Les arguments ne sont pas des commandes dans PATH sans le.
répertoire ...--parents
n'est pas disponible sur macOS 10.13.2. Vous devez utiliser-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
la source
dirname
ne nécessite pas que son argument existe, c'est une pure manipulation de chaîne. Je ne peux pas parler pour d'autres distributions. Rien de mal à ce code afaict.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Enregistrer en tant que script nommé mv ou mv.sh
Ou mettez à la fin de votre fichier ~ / .bashrc une fonction qui remplace le mv par défaut sur chaque nouveau terminal. L'utilisation d'une fonction permet à bash de conserver sa mémoire, au lieu d'avoir à lire un fichier de script à chaque fois.
Celles-ci sont basées sur la soumission de Chris Lutz.
la source
mv
commande améliorée . Particulièrement utile pour les scripts, c'est-à-dire que vous ne voulez pas nécessairement exécuter les vérifications et exécuter àmkdir -p
tout moment que vous devez utilisermv
. Mais comme je voudrais le comportement d'erreur par défaut pourmv
, j'ai changé le nom de la fonction enmvp
- afin que je sache quand je pourrais créer des répertoires.[ ! -a "$dir" ]
J'ai mené des expériences avec la moitié droite étant vraie et fausse, toutes deux évaluées à vrai .. ??? Pour l'amour des autres, tmp = "$ {tmp: -1}" semble saisir le dernier caractère du fichier pour s'assurer qu'il ne s'agit pas d'un chemin (/)Vous pouvez utiliser
mkdir
:Un script simple pour le faire automatiquement (non testé):
la source
Il semble que la réponse soit non :). Je ne veux pas vraiment créer un alias ou une fonction juste pour le faire, souvent parce que c'est unique et que je suis déjà en train de taper la
mv
commande, mais j'ai trouvé quelque chose qui fonctionne bien pour cela:Si
mv
échoue (dir n'existe pas), il fera le répertoire (qui est le dernier argument de la commande précédente, il en$_
est de même). Il suffit donc d'exécuter cette commande, puis upde la réexécuter, et cette fois, celamv
devrait réussir.la source
Le script shell suivant, peut-être?
Voilà l'essentiel. Vous voudrez peut-être ajouter un peu pour vérifier les arguments, et vous voudrez peut-être que le comportement change si la destination existe, ou si le répertoire source existe, ou n'existe pas (c'est-à-dire ne pas écraser quelque chose qui n'existe pas) .
la source
La commande rsync ne peut faire l'affaire que si le dernier répertoire du chemin de destination n'existe pas, par exemple pour le chemin de destination de
~/bar/baz/
sibar
existe maisbaz
n'existe pas, alors la commande suivante peut être utilisée:rsync -av --remove-source-files foo.c ~/bar/baz/
Dans ce cas, le
baz
répertoire sera créé s'il n'existe pas. Mais si les deuxbar
etbaz
n'existent pas, rsync échouera:Donc, fondamentalement, il devrait être sûr de l'utiliser
rsync -av --remove-source-files
comme aliasmv
.la source
La façon la plus simple de le faire est:
Supposons que j'ai téléchargé des fichiers pdf situés dans mon répertoire de téléchargement (
~/download
) et que je souhaite les déplacer tous dans un répertoire qui n'existe pas (disonsmy_PDF
).Je vais taper la commande suivante (en m'assurant que mon répertoire de travail actuel est
~/download
):Vous pouvez ajouter une
-p
optionmkdir
si vous souhaitez créer des sous-répertoires comme ceci: (supposé que je veux créer un sous-répertoire nommépython
):la source
Sillier, mais façon de travail:
Créez le répertoire avec mkdir -p, y compris un répertoire temporaire qui partage le nom du fichier de destination, puis supprimez ce répertoire de nom de fichier avec un simple rmdir, puis déplacez votre fichier vers sa nouvelle destination. Je pense que la réponse en utilisant dirname est probablement la meilleure.
la source
la source
Code:
Exemple:
arguments: "d1" "d2 / sub"
la source
Cela se déplacera
foo.c
vers le nouveau répertoirebaz
avec le répertoire parentbar
.L'
-p
option demkdir
crée des répertoires intermédiaires selon les besoins.Sans
-p
tous les répertoires, le préfixe du chemin doit déjà exister.Tout ce qui se trouve à l'intérieur des backticks
``
est exécuté et la sortie est retournée en ligne dans le cadre de votre commande.Puisque
mkdir
ne renvoie rien, seule la sortie deecho $_
sera ajoutée à la commande.$_
référence le dernier argument à la commande précédemment exécutée.Dans ce cas, il retournera le chemin de votre nouveau répertoire (
~/bar/baz/
) passé à lamkdir
commande.J'ai décompressé une archive sans donner de destination et j'ai voulu déplacer tous les fichiers sauf
demo-app.zip
de mon répertoire actuel vers un nouveau répertoire appelédemo-app
.La ligne suivante fait l'affaire:
ls -A
renvoie tous les noms de fichiers, y compris les fichiers cachés (à l' exception.
..
des fichiers implicites et ).Le symbole de canal
|
est utilisé pour diriger la sortie de lals
commande versgrep
( un utilitaire de recherche en texte brut en ligne de commande ).L'
-v
indicateur indiquegrep
de rechercher et de renvoyer tous les noms de fichiers à l'exclusiondemo-app.zip
.Cette liste de fichiers est ajoutée à notre ligne de commande en tant qu'arguments source de la commande move
mv
. L'argument cible est le chemin d'accès au nouveau répertoire transmis àmkdir
référencé à l'aide$_
et la sortie à l'aideecho
.la source
Vous pouvez même utiliser des extensions d'accolade:
Vous devez utiliser bash 3.0 ou plus récent.
la source
la source
Ma solution à une chaîne:
la source
Vous pouvez enchaîner les commandes:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
ou le script shell est ici:
1. Ouvrez n'importe quel éditeur de texte
2. Script shell copier-coller .
3. Enregistrez- le sous mkdir_mv.sh
4. Entrez le répertoire de votre script:
cd your/script/directory
5. Changez le mode de fichier :
chmod +x mkdir_mv.sh
6. Définissez l' alias :
alias mv="./mkdir_mv.sh"
Maintenant, chaque fois que vous exécutez la commande,
mv
un répertoire mobile sera créé s'il n'existe pas.la source
Sur la base d'un commentaire dans une autre réponse, voici ma fonction shell.
Incluez-le dans .bashrc ou similaire afin de pouvoir l'utiliser partout.
la source