Existe-t-il un moyen de faire en sorte que mv crée le répertoire vers lequel déplacer s'il n'existe pas ?

StackOverflow https://stackoverflow.com/questions/547719

  •  23-08-2019
  •  | 
  •  

Question

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, afin que tu n'aurais qu'à taper

mv foo.c ~/bar/baz/ 

et tout s'arrangerait ?Il semble que vous puissiez alias mv vers un simple script bash qui vérifierait si ces répertoires existaient et, sinon, appellerait mkdir puis mv, mais j'ai pensé vérifier si quelqu'un avait une meilleure idée.

Était-ce utile?

La solution

Qu'en est-ce (en bash) en une ligne:

mkdir --parents ./some/path/; mv yourfile.txt $_

Briser ce bas:

mkdir --parents ./some/path

crée le répertoire (y compris tous les répertoires intermédiaires), après quoi:

mv yourfile.txt $_

déplace le fichier dans ce répertoire ($ _ correspond le dernier argument passé à la précédente commande shell, à savoir: le répertoire nouvellement créé).

Je ne sais pas dans quelle mesure cela va fonctionner dans d'autres coquilles, mais il pourrait vous donner quelques idées sur ce qu'il faut rechercher.

Voici un exemple en utilisant cette technique:

$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt

Autres conseils

mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt

Enregistrer en tant que script nommé mv ou mv.sh

#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"

Ou mettre à la fin de votre fichier ~ / .bashrc en fonction qui remplace le mv par défaut sur chaque nouveau terminal. L'utilisation d'une fonction permet bash garder la mémoire, au lieu d'avoir à lire un fichier de script à chaque fois.

function mv ()
{
    dir="$2"
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
}

Ces basé sur la soumission de Chris Lutz.

Vous pouvez utiliser mkdir:

mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/

Un simple script pour le faire automatiquement (non testé):

#!/bin/sh

# Grab the last argument (argument number $#)    
eval LAST_ARG=\$$#

# Strip the filename (if it exists) from the destination, getting the directory
DIR_NAME=`echo $2 | sed -e 's_/[^/]*$__'`

# Move to the directory, making the directory if necessary
mkdir -p "$DIR_NAME" || exit
mv "$@"

On dirait que la réponse est non :). Je ne veux pas vraiment créer un alias ou Func juste pour ce faire, souvent parce qu'il est unique et je suis déjà au milieu de taper la commande mv, mais j'ai trouvé quelque chose qui fonctionne bien pour cela:

mv *.sh  shell_files/also_with_subdir/ || mkdir -p $_

Si mv échoue, il fera (dir n'existe pas) le répertoire (qui est le dernier argument de la commande précédente, alors $_ l'a). Donc, il suffit d'exécuter cette commande, puis up pour Réexécutez, et ce mv temps devrait réussir.

Le script shell suivant, peut-être?

#!/bin/sh
if [[ -e $1 ]]
then
  if [[ ! -d $2 ]]
  then
    mkdir --parents $2
  fi
fi
mv $1 $2

C'est la partie de base. Vous pouvez ajouter un peu pour vérifier les arguments, et vous pouvez le comportement de changer si la destination existe, ou le répertoire source existe, ou n'existe pas (c.-à ne pas écraser quelque chose qui n'existe pas) .

La plus simple façon de le faire est:

 mkdir [directorie name] && mv [filename] $_

Supposons que je téléchargé des fichiers PDF situés dans mon téléchargement directorie (~ / télécharger) et je veux déplacer tous alors dans une directorie qui ne sort pas (disons « my_PDF » ).
Je vais taper la commande suivante (en vous assurant mon directorie de travail en cours est ~ / téléchargement):

mkdir my_PDF && mv *.pdf $_

Vous pouvez ajouter l'option -p à mkdir si vous voulez créer des sous-répertoires comme ceci: (supposé que je veux créer un subdirectorie nommé "python"):
mkdir -p my_PDF/python && mv *.pdf $_

plus bête, mais beaucoup de travail:

mkdir -p $2
rmdir $2
mv $1 $2

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 rmdir simple, puis déplacez votre fichier vers sa nouvelle destination. Je pense que la réponse à l'aide dirname est probablement le meilleur cependant.

Vous pouvez même utiliser des extensions de Brace:

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      
  • qui crée 3 répertoires (directory1, directory2, directory3),
    • et dans chacun d'eux deux sous-répertoires (subdirectory1, subdirectory2),
      • et dans chacun d'eux deux subsubdirectories (subsubdirectory1 et subsubdirectory2).

Vous devez utiliser bash 3.0 ou plus récent.

rsync commande peut faire l'affaire que si le dernier répertoire dans le chemin de destination n'existe pas, par exemple, pour le chemin de destination de ~/bar/baz/ si bar existe, mais baz ne pas, la commande suivante peut être utilisée:

rsync -av --remove-source-files foo.c ~/bar/baz/

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity
--remove-source-files   sender removes synchronized files (non-dir)

Dans ce cas répertoire baz sera créé si elle n'existe pas. Mais si les deux bar et baz n'existent pas rsync échouera:

sending incremental file list
rsync: mkdir "/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]

Donc, fondamentalement, il doit être sûr d'utiliser rsync -av --remove-source-files comme un alias pour mv.

$what=/path/to/file;
$dest=/dest/path;

mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"

Ma une solution de chaîne:

test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/

Code:

if [[ -e $1 && ! -e $2 ]]; then
   mkdir --parents --verbose -- "$(dirname -- "$2")"
fi
mv --verbose -- "$1" "$2"

Exemple:

arguments: "d1" "d2 / sub"

mkdir: created directory 'd2'
renamed 'd1' -> 'd2/sub'

Vous pouvez enchaîner des commandes :mkdir ~/bar/baz | mv foo.c ~/bar/baz/
ou le script shell est ici :

#!/bin/bash
mkdir $2 | mv $1 $2

1.Ouvrir n'importe quel éditeur de texte
2.Copier coller script shell.
3.Sauvegarder comme mkdir_mv.sh
4.Entrer le répertoire de votre script : cd your/script/directory
5.Changer le mode fichier : chmod +x mkdir_mv.sh
6.Ensemble alias: alias mv="./mkdir_mv.sh"
Désormais, chaque fois que vous exécutez la commande mv Le répertoire en mouvement sera créé s'il n'existe pas.

((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top