linux - überschreiben - mv das verzeichnis ist nicht leer




Gibt es eine Möglichkeit, dass mv das Verzeichnis erstellt, in das es verschoben werden soll, wenn es nicht existiert? (8)

Also, wenn ich in meinem Home-Verzeichnis bin und foo.c nach ~ / bar / baz / foo.c verschieben will, aber diese Verzeichnisse nicht existieren, gibt es eine Möglichkeit, diese Verzeichnisse automatisch zu erstellen, so dass Sie müssten nur tippen

mv foo.c ~/bar/baz/ 

und alles würde funktionieren? Es scheint so, als könntest du mv zu einem einfachen Bash-Skript hinzufügen, das prüfen würde, ob diese Verzeichnisse existieren und wenn nicht, würden wir mkdir und dann mv aufrufen, aber ich dachte, ich würde nachsehen, ob jemand eine bessere Idee hat.


Das folgende Shell-Skript, vielleicht?

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

Das ist der grundlegende Teil. Vielleicht möchten Sie etwas hinzufügen, um nach Argumenten zu suchen, und Sie möchten vielleicht, dass sich das Verhalten ändert, wenn das Ziel existiert oder das Quellverzeichnis existiert oder nicht existiert (dh überschreiben Sie nichts, das nicht existiert) .


Der einfachste Weg das zu tun ist:

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

Angenommen, ich habe PDF-Dateien heruntergeladen, die sich in meinem Download-Verzeichnis (~ / download) befinden, und ich möchte alle in einem Verzeichnis verschieben, das nicht beendet wird (sagen wir "my_PDF" ).
Ich gebe die folgende Anweisung ein (stelle sicher, dass mein aktuelles Arbeitsverzeichnis ~ / download ist):

mkdir my_PDF && mv *.pdf $_

Sie können die Option -p zu mkdir hinzufügen, wenn Sie Unterverzeichnisse wie folgt erstellen wollen: (Ich möchte ein Unterverzeichnis namens "python" erstellen):
mkdir -p my_PDF/python && mv *.pdf $_


Meine einsträngige Lösung:

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

Sie können mkdir :

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

Ein einfaches Skript, um es automatisch zu tun (ungetestet):

#!/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 "[email protected]"

Sillier, aber Arbeitsweise:

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

Machen Sie das Verzeichnis mit mkdir -p einschließlich eines temporären Verzeichnisses, das den Namen der Zieldatei teilt, dann entfernen Sie das Verzeichnis mit dem Dateinamen mit einem einfachen rmdir und verschieben Sie die Datei an ihr neues Ziel. Ich denke, Antwort mit dirname ist wahrscheinlich die beste aber.


Speichern Sie das Skript als mv oder mv.sh

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

Oder legen Sie am Ende Ihrer ~ / .bashrc-Datei als eine Funktion, die die Standard-mv auf jedem neuen Terminal ersetzt. Die Verwendung einer Funktion erlaubt bash, den Speicher zu behalten, anstatt jedes Mal eine Skriptdatei lesen zu müssen.

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

Diese basieren auf der Vorlage von Chris Lutz.


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

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

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




mv