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.
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
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
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.
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]"
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). .
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.
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.
Der einfachste Weg dies zu tun ist:
mkdir [directorie name] && mv [filename] $_
mkdir my_PDF && mv *.pdf $_
mkdir -p my_PDF/python && mv *.pdf $_
Sie können sogar Klammererweiterungen verwenden:
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
Sie müssen bash 3.0 oder neuer verwenden.
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.
Meine Lösung mit einem String:
test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
$what=/path/to/file;
$dest=/dest/path;
mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
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'
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.
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))