Wenn ich mich also in meinem Home-Verzeichnis befinde und foo.c nach ~ / bar / baz / foo.c verschieben möchte, diese Verzeichnisse jedoch nicht vorhanden sind, gibt es eine Möglichkeit, diese Verzeichnisse automatisch zu erstellen Sie müssten nur tippen
mv foo.c ~/bar/baz/
und alles würde klappen? Es scheint, als könnten Sie mv mit einem einfachen Bash-Skript aliasen, das prüft, ob diese Verzeichnisse vorhanden sind, und wenn nicht, mkdir und dann mv aufruft, aber ich dachte, ich würde prüfen, ob jemand eine bessere Idee hat.
Antworten:
Wie wäre es mit diesem Einzeiler (in Bash):
Aufschlüsselung:
Erstellt das Verzeichnis (einschließlich aller Zwischenverzeichnisse). Danach:
Verschiebt die Datei in dieses Verzeichnis ($ _ wird auf das letzte Argument erweitert, das an den vorherigen Shell-Befehl übergeben wurde, dh auf das neu erstellte Verzeichnis).
Ich bin mir nicht sicher, wie weit dies in anderen Shells funktionieren wird, aber es könnte Ihnen einige Ideen geben, wonach Sie suchen sollten.
Hier ist ein Beispiel mit dieser Technik:
quelle
./
überall überflüssig zu sein ? Die Argumente sind keine Befehle in PATH ohne das.
Verzeichnis ...--parents
ist es unter macOS 10.13.2 nicht verfügbar. Sie müssen verwenden-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
quelle
dirname
benötigt kein Argument, es ist reine String-Manipulation. Ich kann nicht für andere Distributionen sprechen. An diesem Code ist nichts auszusetzen.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Speichern Sie als Skript mit dem Namen mv oder mv.sh.
Oder setzen Sie am Ende Ihrer ~ / .bashrc-Datei eine Funktion ein, die die Standard-MV auf jedem neuen Terminal ersetzt. Durch die Verwendung einer Funktion kann bash den Speicher behalten, anstatt jedes Mal eine Skriptdatei lesen zu müssen.
Diese basieren auf der Vorlage von Chris Lutz.
quelle
mv
Befehl. Besonders nützlich für Skripte, dh Sie möchten die Überprüfungen nicht unbedingt ausführen undmkdir -p
jederzeit ausführen, wenn Sie sie benötigenmv
. Da ich jedoch das Standardfehlerverhalten für möchtemv
, habe ich den Funktionsnamen in geändert,mvp
damit ich weiß, wann ich Verzeichnisse erstellen kann.[ ! -a "$dir" ]
ich Experimente durchgeführt habe, bei denen die rechte Hälfte wahr und falsch ist, beide als wahr bewertet. Für andere scheint tmp = "$ {tmp: -1}" das letzte Zeichen der Datei zu erfassen, um sicherzustellen, dass es sich nicht um einen Pfad handelt (/)Sie können verwenden
mkdir
:Ein einfaches Skript, um es automatisch zu machen (ungetestet):
quelle
Es klingt wie die Antwort ist nein :). Ich möchte nicht wirklich einen Alias oder eine Funktion erstellen, nur um dies zu tun, oft, weil es einmalig ist und ich bereits dabei bin, das zu tippen
mv
Befehl , aber ich habe etwas gefunden, das dafür gut funktioniert:Wenn dies
mv
fehlschlägt (dir existiert nicht), wird das Verzeichnis erstellt (dies ist das letzte Argument für den vorherigen Befehl$_
). Führen Sie einfach diesen Befehl aus, upum ihn erneut auszuführen, und diesmalmv
sollte dies erfolgreich sein.quelle
Das folgende Shell-Skript vielleicht?
Das ist der grundlegende Teil. Möglicherweise möchten Sie ein wenig hinzufügen, um nach Argumenten zu suchen, und Sie möchten möglicherweise, dass sich das Verhalten ändert, wenn das Ziel vorhanden ist oder das Quellverzeichnis vorhanden ist oder nicht vorhanden ist (dh etwas nicht überschreiben, das nicht vorhanden ist). .
quelle
Der Befehl rsync kann den Trick nur ausführen , wenn das letzte Verzeichnis im Zielpfad nicht vorhanden ist, z. B. für den Zielpfad von
~/bar/baz/
ifbar
existiert,baz
aber nicht vorhanden ist. Dann kann der folgende Befehl verwendet werden:rsync -av --remove-source-files foo.c ~/bar/baz/
In diesem Fall wird ein
baz
Verzeichnis erstellt, wenn es nicht vorhanden ist. Aber wenn beidesbar
undbaz
nicht vorhanden ist, schlägt rsync fehl:Grundsätzlich sollte es also sicher sein, es
rsync -av --remove-source-files
als Alias für zu verwendenmv
.quelle
Der einfachste Weg, dies zu tun, ist:
Angenommen, ich habe PDF-Dateien heruntergeladen, die sich in meinem Download-Verzeichnis (
~/download
) befinden, und möchte alle in ein nicht vorhandenes Verzeichnis verschieben (sagen wir mal)my_PDF
).Ich gebe den folgenden Befehl ein (um sicherzustellen, dass mein aktuelles Arbeitsverzeichnis ist
~/download
):Sie können eine
-p
Option hinzufügen ,mkdir
wenn Sie Unterverzeichnisse wie folgt erstellen möchten: (Angenommen, ich möchte ein Unterverzeichnis mit dem Namen erstellenpython
):quelle
Alberner, aber funktionierender Weg:
Erstellen Sie das Verzeichnis mit mkdir -p, einschließlich eines temporären Verzeichnisses, das den Namen der Zieldatei teilt, entfernen Sie dieses Dateinamenverzeichnis mit einem einfachen rmdir und verschieben Sie Ihre Datei an das neue Ziel. Ich denke, die Antwort mit dirname ist wahrscheinlich die beste.
quelle
quelle
Code:
Beispiel:
Argumente: "d1" "d2 / sub"
quelle
Dies wird
foo.c
in das neue Verzeichnisbaz
mit dem übergeordneten Verzeichnis verschobenbar
.Die
-p
Option zummkdir
Erstellen von Zwischenverzeichnissen nach Bedarf.Ohne
-p
alle Verzeichnisse im Pfad muss das Präfix bereits vorhanden sein.Alles in Backticks
``
wird ausgeführt und die Ausgabe wird als Teil Ihres Befehls inline zurückgegeben.Da
mkdir
nichts zurückgegeben wird, wird nur die Ausgabe vonecho $_
zum Befehl hinzugefügt.$_
verweist das letzte Argument auf den zuvor ausgeführten Befehl.In diesem Fall wird der Pfad zu Ihrem neuen Verzeichnis (
~/bar/baz/
) zurückgegeben, das an denmkdir
Befehl übergeben wurde.Ich habe ein Archiv entpackt, ohne ein Ziel anzugeben, und wollte alle Dateien außer
demo-app.zip
meinem aktuellen Verzeichnis in ein neues Verzeichnis namens verschiebendemo-app
.Die folgende Zeile macht den Trick:
ls -A
Gibt alle Dateinamen einschließlich versteckter Dateien zurück (mit Ausnahme der impliziten.
und..
).Das Pipe-Symbol
|
wird verwendet, um die Ausgabe desls
Befehls angrep
( ein Befehlszeilen-Nur-Text-Suchdienstprogramm) weiterzuleiten .Das
-v
Flag weist Siegrep
an, alle Dateinamen mit Ausnahme zu suchen und zurückzugebendemo-app.zip
.Diese Liste von Dateien wird unserer Befehlszeile als Quellargumente für den Befehl move hinzugefügt
mv
. Das Zielargument ist der Pfad zu dem neuen Verzeichnis, an das mitmkdir
verwiesen wird$_
und mit ausgegeben wirdecho
.quelle
Sie können sogar Klammerverlängerungen verwenden:
Sie müssen bash 3.0 oder neuer verwenden.
quelle
quelle
Meine One-String-Lösung:
quelle
Sie können Befehle verketten:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
oder Shell-Skript ist hier:
1. Öffnen Sie einen beliebigen Texteditor.
2. Kopieren und Einfügen des Shell-Skripts.
3. Speichern Sie es als mkdir_mv.sh.
4. Geben Sie das Verzeichnis Ihres Skripts ein:
cd your/script/directory
5. Ändern Sie den Dateimodus :
chmod +x mkdir_mv.sh
6. Legen Sie den Alias fest :
alias mv="./mkdir_mv.sh"
Wenn Sie einen Befehl ausführen
mv
, wird jetzt ein Verschiebungsverzeichnis erstellt, falls es nicht vorhanden ist.quelle
Basierend auf einem Kommentar in einer anderen Antwort, hier ist meine Shell-Funktion.
Fügen Sie dies in .bashrc oder ähnliches ein, damit Sie es überall verwenden können.
quelle