Saya memiliki direktori foo
dengan subdirektori. Saya ingin membuat nama subdirektori yang sama di direktori lain tanpa menyalin kontennya. Bagaimana saya melakukan ini?
Apakah ada cara untuk mendapatkan ls
output sebagai daftar ekspansi brace?
Coba ini,
cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
. -type d
Untuk membuat daftar direktori di jalur saat ini secara rekursif.mkdir -p -- /destination/directory/{}
buat direktori di tujuan. Ini bergantung pada find
yang mendukung perluasan {}
di tengah kata argumen.
find
mendukung interpolasi{}
ke string lain./source/dir/path
, maka ini mungkin gagal dengan kesalahan "daftar argumen terlalu panjang" ketika shell mencoba memanggilfind
dengan perluasan*
. Lebih baik gunakan saja di.
sana. Juga, sebagian besarfind
implementasi memungkinkan{}
untuk digunakan bahkan ketika digabungkan dengan string lain, tetapi itu tidak universal..
Alih-alih*
dalam hal ini. (Menggunakan xarg untuk kinerja dan keamanan mungkin akan memerlukan skrip eksternal untuk path concatenation)Menggunakan
rsync
:Ini akan menciptakan kembali struktur direktori
/some/path/dir
sepertidir
pada direktori saat ini, tanpa menyalin file apa pun.Direktori apa pun yang ditemukan di jalur sumber akan dibuat pada target karena pola penyertaan, tetapi hal lain akan dikecualikan. Sebagai efek samping dari penggunaan
-a
(--archive
), Anda akan mendapatkan cap waktu yang sama pada semua subdirektori dalam target seperti pada sumber. Ini juga berfungsi untuk membuat struktur direktori lokal dari direktori jarak jauh (dan sebaliknya).sumber
rsync
!Anda dapat menggunakan
find
untuk melintasi struktur sumber dan memanggilmkdir
setiap direktori yang ditemuinya.Contoh ini, menggunakan
find
, akan menyalin struktur direktori Anda darifoo
ke/tmp/another/
The
exec
Loop membangun set direktori di bawahnyafoo
, yang kemudian diteruskan kemkdir
. Jika Anda tidak memiliki versifind
yang mengerti,+
Anda dapat menggunakannya\;
dengan biaya efisiensi. Gantikanmkdir
denganecho mkdir
untuk melihat apa yang akan terjadi tanpa benar-benar melakukannya.sumber
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(itu bekerja dengan baik-exec ... \;
)/path/to/{}
tetapi saya sekarang tidak dapat menemukan versi mana pun yang berfungsi sehingga saya telah mengadaptasi solusinya. Terima kasihDengan bash shell, Anda bisa memintanya untuk perluasan setiap direktori dengan
globstar
opsi:dan kemudian salin direktori dengan lingkaran:
... atau jika Anda pikir semuanya akan cocok dalam satu panggilan ke
mkdir
:Itu sintaks bash array yang mengatakan: "ambil setiap elemen
$@
array dan gantikan awal dari masing-masingnya/path/to/dest/
.Saya tidak mengetahui cara untuk mendapatkan
ls
output secara langsung sebagai daftar ekspansi brace. Jika Anda mencoba memijat output**/
ekspansi menjadi ekspansi brace, Anda harus berhati-hati untuk:{
atau${
urutanSaya tidak akan merekomendasikannya.
sumber
Pertanyaannya adalah duplikat lintas-situs /superuser/1389580/copy-directory-structure-only-at-year-end
Jenis tugas ini adalah kasus penggunaan klasik untuk
mtree
:Di atas membuat semua direktori di bawah
new-tree
yang ada di bawahold-tree
.mtree
tidak menetapkan cap waktu pada direktori yang baru dibuat, sehingga pohon yang dihasilkan terlihat seperti ini:Jika Anda lebih suka
new-tree
cap waktu cocok dengan yang ada diold-tree
, cukup jalankanmtree
lagi. Karena direktori sudah ada,mtree
akan mengubah stempel waktu agar sesuai dengan spesifikasi sumber:sumber