Saya memiliki struktur folder dengan banyak file * .csv yang tersebar di folder. Sekarang saya ingin menyalin semua file * .csv ke tujuan lain dengan menjaga struktur folder.
Ini bekerja dengan melakukan:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
dan seterusnya, tetapi saya ingin melakukannya dengan menggunakan satu perintah.
'{}'
bekerja dengan baik-execdir
lebih aman daripada itu-exec
, hanya mengganti satu dengan yang lain tidak mempertahankan struktur folder sebagaimana dimaksud.Anda juga bisa menggunakannya
rsync
untuk ini.Jika Anda ingin menyimpan direktori kosong dari pohon sumber, lewati
--prune-empty-dirs
opsi:Jika Anda tidak ingin symlink, tanggal modifikasi, izin file, pemilik, dll. Dipertahankan, ganti
-a
dengan kombinasi lain dari-rlptgoD
. ;-)sumber
-m
adalah jalan pintas untuk--prune-emty-dirs
.-R
opsi dapat ditambahkan untuk menyalin struktur direktori induk sumber. (lihat jawaban saya di sini.)Anda dapat menggunakan find dan cpio dalam mode pass through
Ini akan menemukan semua file .csv di direktori saat ini dan di bawah ini dan menyalinnya ke / target mempertahankan struktur direktori yang sudah di-root
.
.Jika Anda menggunakan
itu akan menemukan semua file di dalam
/path/to/files
dan di bawah dan menyalinnya ke/target/path/to/files
dan di bawah.sumber
The
cp
perintah memungkinkan beberapa argumen sumber:CAVEAT: Saya menggunakan bola rekursif di sini; ini adalah
globstar
opsi dalam Bash 4+ danksh
, dan didukung secara default padazsh
. Gumpalan rekursif tidak cocok dengan file dan folder tersembunyi, dan beberapa implementasi mengikuti symlink sedangkan yang lain tidak .Jika shell Anda tidak mendukung gumpalan rekursif, atau jika Anda memilih untuk tidak menggunakannya, Anda dapat melakukan hal berikut:
*.csv */*.csv */*/*.csv */*/*/*.csv
- ini tentu saja sangat berlebihan dan perlu mengetahui seberapa dalam struktur direktori Anda.$(find . -name '*.csv')
- Ini akan cocok dengan file dan folder tersembunyi.find
juga mendukung menentukan apakah symlink diikuti atau tidak, yang mungkin bermanfaat.sumber
shopt -s globstar
segera sebelum perintah saya dan semuanya baik-baik saja. Terima kasih atas tindak lanjutnya!--parents
adalah apa yang saya cari. terima kasihYang ini bekerja untuk saya:
find -name "*.csv" | xargs cp --parents -t /target
sumber
find [things] | xargs [do stuff]
sangat kuat.find -print0
danxargs -0
.Dengan asumsi Anda ingin meniru struktur ini dari
./source
ke./destination
:Saya siap untuk menghitung itu sebagai satu baris,
cd source
menjadi shell builtin.sumber
tar
memiliki-C
opsi untuk menghindari keharusan mengubah direktori terlebih dahulu.Dari
rsync
halaman manual:Jadi, ini juga akan berhasil:
sumber