it-swarm.com.de

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

Wenn ich also in meinem Heimatverzeichnis bin und foo.c nach ~/bar/baz/foo.c verschieben möchte, diese Verzeichnisse jedoch nicht existieren, gibt es eine Möglichkeit, diese Verzeichnisse automatisch erstellen zu lassen Sie müssten nur tippen

mv foo.c ~/bar/baz/ 

und alles würde klappen Es scheint, als könnten Sie mv als Alias ​​auf ein einfaches Bash-Skript setzen, das prüft, ob diese Verzeichnisse vorhanden sind, und wenn nicht, würde er mkdir und dann mv aufrufen.

202
Paul Wicks

Wie wäre es mit diesem One-Liner (in Bash):

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

Das brechen:

mkdir --parents ./some/path

erstellt das Verzeichnis (einschließlich aller Zwischenverzeichnisse), woraufhin:

mv yourfile.txt $_

verschiebt die Datei in dieses Verzeichnis ($ _ wird bis zum letzten Argument erweitert, das an den vorherigen Shell-Befehl übergeben wurde, dh das neu erstellte Verzeichnis).

Ich bin nicht sicher, wie weit dies in anderen Shells funktionieren wird, aber es könnte Ihnen ein paar Ideen geben, wonach Sie suchen müssen.

Hier ist ein Beispiel, das diese Technik verwendet:

$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt
221
KarstenF
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt
53
Billmc

Speichern Sie als Skript mit dem Namen 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 setzen Sie am Ende Ihrer ~/.bashrc-Datei eine Funktion, die die Standard-mv an jedem neuen Terminal ersetzt. Durch die Verwendung einer Funktion behält bash den Speicher bei, 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 Einreichung von Chris Lutz.

20
Sepero

Sie können mkdir verwenden:

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

Ein einfaches Skript zum automatischen Ausführen (nicht getestet):

#!/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]"
13
strager

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, dass das Verhalten geändert wird, wenn das Ziel vorhanden ist oder das Quellverzeichnis vorhanden ist oder nicht existiert (dh nicht etwas überschreiben, das nicht vorhanden ist). .

5
Chris Lutz

Es klingt wie die Antwort ist nein :). Ich möchte nicht wirklich einen Alias ​​oder eine Funktion erstellen, um dies zu tun, oft, weil dies einmalig ist und ich gerade dabei bin, den Befehl mv einzugeben, aber ich habe etwas gefunden, das gut dafür funktioniert:

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

Wenn mv fehlschlägt (dir existiert nicht), wird das Verzeichnis erstellt (das das letzte Argument zum vorherigen Befehl ist, also hat $_ es). Führen Sie dann einfach diesen Befehl aus up Um es erneut auszuführen, sollte diesmal mv erfolgreich sein.

4
Pat

Sillier, aber Arbeitsweise:

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

Erstellen Sie das Verzeichnis mit mkdir -p, einschließlich eines temporären Verzeichnisses, das den Zieldateinamen freigibt, entfernen Sie dann das Dateinamenverzeichnis mit einem einfachen rmdir und verschieben Sie die Datei an das neue Ziel .. __ Ich denke, die Antwort mit dirname ist wahrscheinlich die am besten aber.

2
Blarn Blarnson

Der einfachste Weg dies zu tun ist:

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

Nehmen wir an, ich habe PDF-Dateien heruntergeladen, die sich in meiner Download-Directorie (~/download) befinden, und ich möchte alles in eine Directorie verschieben, die nicht beendet wird (sagen wir "my_PDF").
Ich gebe den folgenden Befehl ein (um sicherzustellen, dass meine derzeitige Directorie ~/download ist):

mkdir my_PDF && mv *.pdf $_

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

2
Abdoul Seibou

Sie können sogar Klammererweiterungen verwenden:

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      
  • dadurch werden 3 Verzeichnisse erstellt (Verzeichnis1, Verzeichnis2, Verzeichnis3),
    • und in jedem von ihnen zwei Unterverzeichnisse (Unterverzeichnis1, Unterverzeichnis2),
      • und in jedem von ihnen zwei Unterverzeichnisse (Unterverzeichnis1 und Unterverzeichnis2).

Sie müssen bash 3.0 oder neuer verwenden.

1

rsync command kann den Trick nur ausführen, wenn das letzte Verzeichnis im Zielpfad nicht vorhanden ist, z. für den Zielpfad von ~/bar/baz/ Wenn bar vorhanden ist, baz jedoch nicht, kann der folgende Befehl verwendet werden:

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)

In diesem Fall wird ein baz-Verzeichnis erstellt, falls es nicht existiert. Wenn jedoch bar und baz nicht vorhanden sind, schlägt rsync fehl:

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]

Im Grunde sollte es also sicher sein, rsync -av --remove-source-files als Alias ​​für mv zu verwenden.

1
sepehr

Meine Lösung mit einem String:

test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
0
Andrey
$what=/path/to/file;
$dest=/dest/path;

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

Code:

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

Beispiel:

argumente: "d1" "d2/sub"

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

Sie können Befehle verketten: mkdir ~/bar/baz | mv foo.c ~/bar/baz/
oder Shell-Skript ist hier:

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

1. Öffnen beliebiger Texteditor
2. Kopieren und einfügen Shell-Skript.
3. Speichern Sie es als mkdir_mv.sh
4. Geben Sie ein das Verzeichnis Ihres Skripts: cd your/script/directory
5. Ändern Sie den Dateimodus : chmod +x mkdir_mv.sh
6. Set alias: alias mv="./mkdir_mv.sh"
Immer wenn Sie den Befehl mv ausführen, wird das Verschiebungsverzeichnis erstellt, wenn es nicht existiert. 

0
Sharofiddin
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))
0
svaardt