Erstellen Sie die Datei und das übergeordnete Verzeichnis

19

Ich weiß, dass dieser touchBefehl eine Datei erstellt:

touch test1.txt

aber wie kann ich eine datei mit vollem pfad erstellen?

Zum Beispiel enthält mein Desktop nichts:

~/Desktop/$ ls
~/Desktop/$

und ich möchte 1.txt in erstellen ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Kann ich das mit einem einfachen Befehl machen wie:

$ touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

anstatt den vollständigen Pfad manuell zu erstellen und dann die Datei zu erstellen?

MA Heshmat Khah
quelle

Antworten:

23

touchkann keine Verzeichnisse anlegen, das brauchst du mkdirdafür.

Hat mkdirjedoch die nützliche -p/ --parentsOption, die eine vollständige Verzeichnisstruktur erstellt.

Von man mkdir:

   -p, --parents
          no error if existing, make parent directories as needed

Der Befehl, den Sie in Ihrer speziellen Situation benötigen, lautet also:

mkdir -p ~/Desktop/a/b/c/d/e/f/g/h/ && touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

Wenn Sie glauben, dass Sie dies öfter benötigen und den Pfad nicht jedes Mal zweimal eingeben möchten, können Sie auch eine Bash-Funktion oder ein Skript dafür erstellen.

  • Bash-Funktion ( ~/.bashrcHängen Sie diese Zeile an, um sie dauerhaft für Ihren Benutzer verfügbar zu haben. Andernfalls wird sie beim Verlassen des Terminals wieder ausgeblendet.):

    touch2() { mkdir -p "$(dirname "$1")" && touch "$1" ; }
    

    Es kann einfach so verwendet werden:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Bash-Skript (speichern Sie es /usr/local/bin/touch2mit sudo, um es für alle Benutzer verfügbar zu machen, ansonsten ~/bin/touch2nur für Ihren Benutzer):

    #!/bin/bash
    mkdir -p "$(dirname "$1")" &&
        touch "$1"
    

    Vergessen Sie nicht, das Skript mit ausführbar zu machen chmod +x /PATH/TO/touch2.

    Danach können Sie es auch so ausführen:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
Byte Commander
quelle
Kann ich den ursprünglichen touch Befehl bearbeiten und einen Schalter hinzufügen -p?
MA Heshmat Khah
3
@HeshmatKhah Es sollte möglich sein, aber es wird nicht empfohlen, ausführbare Systemdateien mit Ihren eigenen Skripten oder Funktionen zu spiegeln. Sie könnten touch-pstattdessen den Namen (kein Leerzeichen!) Verwenden touch2, wenn Sie das "p" bevorzugen, aber ich würde nicht versuchen, den ursprünglichen Befehl zu ersetzen.
Byte Commander
1
Beachten Sie, dass Sie stattdessen dirnameauch die Option zum Entfernen von Suffixen verwenden können, z. B. mkdir -p "${1%/}" && touch "$1"wie askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy,
7

Man kann den installBefehl mit -Dflag benutzen .

bash-4.3$ install -D /dev/null mydir/one/two

bash-4.3$ tree mydir
mydir
└── one
    └── two

1 directory, 1 file
bash-4.3$ 

Wenn wir mehrere Dateien haben, können Sie eine Liste von Elementen verwenden (beachten Sie, dass Sie Elemente mit Leerzeichen in Anführungszeichen setzen müssen) und diese durchlaufen:

bash-4.3$ for i in mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} ; do 
> install -D /dev/null "$i"
> done
bash-4.3$ tree mydir
mydir
├── one
│   └── two
├── subdir 2
│   ├── file3
│   └── file4
└── subdir one
    ├── file1
    └── file2

Oder alternativ mit Array:

bash-4.3$ arr=( mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} )
bash-4.3$ for i in "${arr[@]}"; do  install -D /dev/null "$i"; done
bash-4.3$ tree mydir
mydir
├── one
│   └── two
├── subdir 2
│   ├── file3
│   └── file4
└── subdir one
    ├── file1
    └── file2
Sergiy Kolodyazhnyy
quelle
Bei diesem Ansatz erhält die neue Datei standardmäßig ausführbare Berechtigungen. Um ihm die gleichen Berechtigungen zu geben, die er mit Berührung erhalten würde, kann maninstall -m 644 -D /dev/null <filepath>
ricab
1

Zu diesem Zweck können Sie Ihre eigene Funktion erstellen, Beispiel unten:

$ echo 'mkfile() { mkdir -p "$(dirname "$1")" && touch "$1" ;  }' >> ~/.bashrc
$ source ~/.bashrc
$ mkfile ./fldr1/fldr2/file.txt

Zuerst fügen wir mit dem Befehl echo eine Funktion an das Ende der Datei ~ / .bashrc ein. Mit der Funktion -p Flag in können Sie die verschachtelten Ordner wie z. B. fldr2 aus unserem Beispiel erstellen. Schließlich aktualisieren wir die Datei mit dem Befehl source und führen schließlich den kürzlich erstellten Befehl mkfile aus

Purkhalo Alex
quelle