Dosya ve üst dizini oluşturma


20

Bu touchkomutun bir dosya oluşturduğunu biliyorum :

touch test1.txt

ama bir dosyayı ve tam yolunu nasıl oluşturabilirim?

Örneğin masaüstümde hiçbir şey yok:

~/Desktop/$ ls
~/Desktop/$

ve içinde 1.txt oluşturmak istiyorum ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Bunu aşağıdaki gibi basit bir komutla yapabilir miyim:

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

manuel olarak tam yol oluşturmak ve sonra dosyayı oluşturmak yerine?

Yanıtlar:


24

touchdizinler oluşturamıyor, mkdirbunun için ihtiyacınız var.

Ancak, tam dizin yapısı oluşturan mkdirfaydalı -p/ --parentsseçeneğe sahiptir.

Gönderen man mkdir:

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

Özel durumunuz için ihtiyacınız olan komut:

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

Buna daha sık ihtiyacınız olacağını düşünüyorsanız ve yolu her seferinde iki kez yazmak istemiyorsanız, bunun için bir Bash işlevi veya komut dosyası da yapabilirsiniz.

  • Bash işlevi ( ~/.bashrckullanıcı için kalıcı olarak kullanılabilir olması için bu satırı ekleyin , aksi takdirde terminalinizden çıktığınızda tekrar kaybolacaktır):

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

    Basitçe şu şekilde kullanılabilir:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Bash betiği ( /usr/local/bin/touch2tüm kullanıcılar için sudo kullanarak saklayın , ~/bin/touch2sadece kullanıcılarınız için kullanın):

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

    Komut dosyasını kullanarak çalıştırılabilir yapmayı unutmayın chmod +x /PATH/TO/touch2.

    Bundan sonra şu şekilde de çalıştırabilirsiniz:

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

orijinal touch komutu düzenleyebilir ve -pona anahtar ekleyebilir miyim?
MA Heshmat Khah

3
@HeshmatKhah Mümkün olmalıdır, ancak sistem yürütülebilir dosyalarının kendi komut dosyalarınız veya işlevlerinizle gölgelenmesi önerilmez. "P" yi tercih ederseniz , adı touch-p(boşluk yok!) Kullanabilirsiniz touch2, ancak orijinal komutu değiştirmeyi denemezdim.
Byte Komutanı

1
Not Eğer yerine eki kaldırılmasını kullanabileceği dirnamesıra, yapabileceğin yani mkdir -p "${1%/}" && touch "$1"aynı şekilde, askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy

7

Bir bayrak installile komut kullanabilirsiniz -D.

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$ 

Birden fazla dosyamız varsa, bir öğe listesi kullanmayı (not, boşluklu öğeleri alıntılamayı unutmayın) ve bunları yinelemeyi düşünebiliriz:

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

Veya alternatif olarak dizi ile:

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

Bu yaklaşımla, yeni dosya varsayılan olarak yürütülebilir izinler alır. Dokunarak alacağı izinleri vermek için kullanabilirsinizinstall -m 644 -D /dev/null <filepath>
ricab

1

Bu amaçla kendi işlevinizi oluşturabilirsiniz, aşağıdaki örnek:

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

Önce ~ / .bashrc dosyasının sonuna echo komutunu kullanarak bir işlev ekliyoruz. İşlevdeki -p bayrağı, örneğimizden fldr2 gibi iç içe klasörlerin oluşturulmasına izin verir. Son olarak dosyayı source komutuyla güncelliyoruz ve en son oluşturulan mkfile komutunu çalıştırıyoruz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.