Utwórz plik i jego katalog nadrzędny

19

Wiem, że touchpolecenie tworzy plik:

touch test1.txt

ale jak mogę utworzyć plik i pełną ścieżkę?

na przykład mój pulpit nie zawiera nic:

~/Desktop/$ ls
~/Desktop/$

i chcę utworzyć 1.txt w ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Czy mogę to zrobić za pomocą prostej komendy, takiej jak:

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

zamiast ręcznie utworzyć pełną ścieżkę, a następnie utworzyć plik?

MA Heshmat Khah
źródło

Odpowiedzi:

23

touchnie jest w stanie tworzyć katalogów, potrzebujesz mkdirtego.

Jednak mkdirma użyteczny-p / --parentsopcja, która tworzy pełną strukturę katalogów.

Od man mkdir:

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

Polecenie potrzebne w konkretnej sytuacji to:

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

Jeśli uważasz, że będziesz tego potrzebował częściej i nie chcesz za każdym razem wpisywać ścieżki dwa razy, możesz także utworzyć dla niej funkcję Bash lub skrypt.

  • Funkcja Bash (dodaj tę linię, aby ~/.bashrcstale udostępnić ją użytkownikowi, w przeciwnym razie zniknie ona ponownie po wyjściu z terminala):

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

    Można go po prostu użyć w następujący sposób:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Skrypt Bash (przechowuj go /usr/local/bin/touch2za pomocą sudo, aby był dostępny dla wszystkich użytkowników, w innym ~/bin/touch2przypadku tylko dla użytkownika):

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

    Nie zapomnij, aby skrypt był wykonywalny przy użyciu chmod +x /PATH/TO/touch2.

    Następnie możesz uruchomić go w następujący sposób:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
Bajt Dowódca
źródło
czy mogę edytować oryginalne touch polecenie i dodać -pdo niego przełącznik ?
MA Heshmat Khah
3
@HeshmatKhah Powinno to być możliwe, ale nie zaleca się cieniowania plików wykonywalnych systemu własnymi skryptami lub funkcjami. Możesz użyć nazwy touch-p(bez spacji!) Zamiast touch2, jeśli wolisz „p”, ale nie próbowałbym zastąpić oryginalnej komendy.
Bajt Dowódca
1
Zauważ, że możesz również użyć usuwania sufiksu zamiast dirname, tj. Możesz to zrobić mkdir -p "${1%/}" && touch "$1"tak samo, jak askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy
7

Można użyć installpolecenia z -Dflagą.

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$ 

Jeśli mamy wiele plików, warto rozważyć użycie listy elementów (pamiętaj, aby cytować elementy ze spacjami) i iterację nad nimi:

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

Lub alternatywnie z tablicą:

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
źródło
Dzięki takiemu podejściu nowy plik domyślnie otrzymuje uprawnienia do wykonywania. Aby nadać mu te same uprawnienia, które uzyskałby dotykiem, można użyćinstall -m 644 -D /dev/null <filepath>
ricab 10.09.19
1

W tym celu możesz stworzyć własną funkcję, przykład poniżej:

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

Najpierw wstawiamy funkcję na końcu pliku ~ / .bashrc za pomocą polecenia echo. Opcja -p w funkcji pozwala tworzyć zagnieżdżone foldery, takie jak fldr2 z naszego przykładu. Na koniec aktualizujemy plik za pomocą polecenia źródłowego i ostatecznie wykonujemy ostatnio utworzone polecenie mkfile

Purkhalo Alex
źródło