Bukannya saya sadar .. tetapi Anda hanya bisa melakukan mkdir -p / path / to / make && touch / path / to / file ... Yang mana akan membuat file kosong dalam struktur direktori baru yang Anda buat semua sesuai kebutuhan.
1
@Kansha menggabungkannya dengan dirnamedan basenamedan kita hanya perlu argumen tunggal; keuntungan! :)
Ya, panggilan yang bagus.
Jawaban:
29
Instal akan melakukan ini, jika diberi file sumber /dev/null. The -Dargumen mengatakan untuk membuat semua direktori induk:
anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c
-rwxr-xr-x 1 anthony anthony 0Jan3010:31/tmp/a/b/c
Tidak yakin apakah itu bug atau tidak — perilakunya dengan file perangkat tidak disebutkan dalam manual. Anda juga bisa memberikannya file kosong (baru dibuat dengan mktemp, misalnya) sebagai sumber.
Tidak testdiperlukan; mkdir -ptidak melakukan apa-apa jika direktori sudah ada. Bahkan tidak mengembalikan kesalahan.
derobert
1
Dan tentu saja, ini hanya membuat direktori.
CVn
0
Saya akan menyarankan karena tetap pada satu baris, meskipun pengaturan variabel secara terpisah memungkinkan Anda untuk mengubahnya dan jalankan kembali perintah dari sejarah dengan mudah.
Rob Griffiths memposting sebuah artikel pada tahun 2007 berjudul Mudah Membuat Banyak Folder Baru di Macworld.com di mana ia berdiskusi menggunakan xargsperintah untuk membaca dalam daftar file untuk membuat direktori menggunakan mkdir.
xargsmampu mereferensikan a placeholder( {}) dengan -Iflag, yang berisi nilai untuk setiap argumen yang diteruskan xargs. Inilah perbedaan antara dengan bendera itu, dan tanpa:
Perintah ini pada dasarnya memetakan setiap nama file dalam daftar file yang dipisahkan baris, memotong bagian file, membuat direktori dengan mkdir -pdan kemudian touchnama file di direktori masing-masing.
Berikut ini rincian dari apa yang terjadi pada perintah di atas:
Katakan misalnya files.txtpenampilan saya seperti ini:
cat files.txt menghasilkan deeply/nested/foo/bar.jsdeeply/nested/baz/fiz.txt
deeply/nested/foo/bar.jsdeeply/nested/baz/fiz.txt disalurkan ke xargs
karena kita menggunakan -I {}, xargsakan menerjemahkan setiap argumen ke perintah itu sendiri, jadi sekarang kita memiliki:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
kami kemudian menjalankan perintah shell yang menggunakan &&combinator untuk mengelompokkan 3 perintah yang berjalan secara berurutan - perintah pertama menyimpan file dalam variabel lingkungan (yang akan digunakan kembali pada file berikutnya) menggunakan placeholder yang telah kami daftarkan sebelumnya, jadi kami sekarang memiliki:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
kita sekarang memiliki variabel yang bisa kita lewati mkdir -p, tetapi kita perlu memotong nama file. Cukup sederhana menggunakan '${f%/*}':
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
dan kemudian kita hanya mereferensikan fvariabel secara keseluruhan ketika kita touch:
Anda memiliki semua penjelasan ini untuk apa yang pada dasarnya cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"', yang memiliki UUOC, kemudian Anda subshell menjadi xargs yang subshell kembali ke shell, ketika sebuah while readloop lebih masuk akal
Steven Penny
1
Saya akui saya bukan yang paling tahu tentang perintah * nix - saya bahkan tidak tahu apa itu UUOC - tapi saya gagal melihat bagaimana ini adalah jawaban yang buruk. Itu sedang diteliti, diuji dan merupakan solusi untuk pertanyaan awal Anda. Itu konstruktif (tidak seperti komentar Anda yang agak kasar). Tolong, jika Anda merasa bahwa saya telah melakukan sesuatu yang tidak bertanggung jawab di sini yang seharusnya tidak saya lakukan, maka uraikan lebih lanjut - jelaskan alasannya . Saya tidak terlalu peduli dengan perdebatan pendapat yang tidak memiliki substansi.
razorbeard
1
Komentar terakhir saya menjelaskannya dengan sempurna. Seluruh jawaban Anda bisa ditulis dengan lebih baik while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt. Fakta bahwa Anda tidak dapat melakukan pencarian internet 10 detik untuk UUOC juga memberi tahu
dirname
danbasename
dan kita hanya perlu argumen tunggal; keuntungan! :)Jawaban:
Instal akan melakukan ini, jika diberi file sumber
/dev/null
. The-D
argumen mengatakan untuk membuat semua direktori induk:Tidak yakin apakah itu bug atau tidak — perilakunya dengan file perangkat tidak disebutkan dalam manual. Anda juga bisa memberikannya file kosong (baru dibuat dengan
mktemp
, misalnya) sebagai sumber.sumber
Tidak, tidak sejauh yang saya tahu. Tetapi Anda selalu dapat menggunakan
mkdir -p
dantouch
saling berhadapan:sumber
Saya sering mengalami situasi seperti ini, jadi saya hanya menulis fungsi di
.bashrc
file saya . Ini terlihat seperti iniJadi, ketika saya ingin membuat file di dalam jalur direktori yang tidak ada, saya akan mengatakan
sumber
touchp
, sepertimkdir -p
sumber
test
diperlukan;mkdir -p
tidak melakukan apa-apa jika direktori sudah ada. Bahkan tidak mengembalikan kesalahan.Saya akan menyarankan karena tetap pada satu baris, meskipun pengaturan variabel secara terpisah memungkinkan Anda untuk mengubahnya dan jalankan kembali perintah dari sejarah dengan mudah.
sumber
Dimungkinkan untuk "berpura-pura".
Pertama, beberapa teori yang dibutuhkan:
Rob Griffiths memposting sebuah artikel pada tahun 2007 berjudul Mudah Membuat Banyak Folder Baru di Macworld.com di mana ia berdiskusi menggunakan
xargs
perintah untuk membaca dalam daftar file untuk membuat direktori menggunakanmkdir
.xargs
mampu mereferensikan aplaceholder
({}
) dengan-I
flag, yang berisi nilai untuk setiap argumen yang diteruskanxargs
. Inilah perbedaan antara dengan bendera itu, dan tanpa:xargs
juga mampu menjalankan perintah shell sewenang-wenang dengansh -c
bendera:Menggabungkan Konsep:
Kita bisa menggabungkan konsep-konsep ini dengan
mkdir -p
bukannyamkdir
dan konsep di @ldx 's jawaban untuk menghasilkan ini:Perintah ini pada dasarnya memetakan setiap nama file dalam daftar file yang dipisahkan baris, memotong bagian file, membuat direktori dengan
mkdir -p
dan kemudiantouch
nama file di direktori masing-masing.Berikut ini rincian dari apa yang terjadi pada perintah di atas:
Katakan misalnya
files.txt
penampilan saya seperti ini:cat files.txt
menghasilkandeeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
disalurkan kexargs
-I {}
,xargs
akan menerjemahkan setiap argumen ke perintah itu sendiri, jadi sekarang kita memiliki:deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
&&
combinator untuk mengelompokkan 3 perintah yang berjalan secara berurutan - perintah pertama menyimpan file dalam variabel lingkungan (yang akan digunakan kembali pada file berikutnya) menggunakan placeholder yang telah kami daftarkan sebelumnya, jadi kami sekarang memiliki:f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
mkdir -p
, tetapi kita perlu memotong nama file. Cukup sederhana menggunakan'${f%/*}'
:mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
f
variabel secara keseluruhan ketika kitatouch
:touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt
sumber
cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
, yang memiliki UUOC, kemudian Anda subshell menjadi xargs yang subshell kembali ke shell, ketika sebuahwhile read
loop lebih masuk akalwhile read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt
. Fakta bahwa Anda tidak dapat melakukan pencarian internet 10 detik untuk UUOC juga memberi tahu