Saya ingin menyalin semua file dari sebuah dir kecuali yang bernama Default.png. Tampaknya ada beberapa cara untuk melakukan ini. Apa yang menurut Anda paling efektif?
Saya ingin menyalin semua file dari sebuah dir kecuali yang bernama Default.png. Tampaknya ada beberapa cara untuk melakukan ini. Apa yang menurut Anda paling efektif?
Jawaban:
Sederhana, jika src/
hanya berisi file:
find src/ ! -name Default.png -exec cp -t dest/ {} +
Jika src/
memiliki sub-direktori, ini menghilangkannya, tetapi menyalin file di dalamnya:
find src/ -type f ! -name Default.png -exec cp -t dest/ {} +
Jika src/
memiliki sub-direktori, ini tidak akan muncul kembali di dalamnya:
find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +
\;
menjalankan perintah satu kali per file. +
menjalankan perintah satu kali dan meneruskan semua nama file sekaligus (tunduk pada batas panjang baris perintah). +
sedikit lebih efisien secara umum.
Seharusnya sebagai berikut:
cp -r !(Default.png) /dest
Jika menyalin ke folder yang bersarang di folder saat ini (disebut contoh dalam kasus di bawah), Anda juga perlu menghilangkan direktori itu:
cp -r !(Default.png|example) /example
shopt -s extglob
bekerja, jika telah dinonaktifkan.
shopt -s extglob
seperti yang dijelaskan oleh @BarryKelly. Dengan itu, ini bekerja dengan sempurna.
!()
... Indah! Bagi mereka yang --seperti saya-- merasa sudah waktunya mempelajari / mengulas bash , berikut adalah tautan relevan yang terkait dengan pertanyaan / jawaban ini: shopt / extglob dan polanya .
rsync telah menjadi pengganti cp / scp saya untuk waktu yang lama:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-r
argumen jika Anda menyinkronkan direktori
Saya hanya akan melakukan:
cp srcdir/* destdir/ ; rm destdir/Default.png
kecuali jika filenya besar. Jika tidak, gunakan mis
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
Default.png
ada di dua direktori, itu akan menggantikan satu di destdir
dengan yang di srcdir
, lalu menghapus yang disalin Default.png
. Sebaliknya, OP ingin mempertahankan Default.png
yang sudah ada destdir
.
Ini berfungsi dengan baik untuk menyalin semuanya kecuali modul node :) selamat menikmati dan terima kasih atas jawaban di atas yang baru saja saya tambahkan. Rsync lebih baik menurut saya daripada CP karena Anda dapat melihat bilah kemajuan tanpa memintanya.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
gunakan parameter ekspansi shell dengan regex
cp /<path>/[^not_to_copy_file]* .
Semuanya akan disalin kecuali not_to_copy_file
- jika ada yang salah dengan ini. harap Tentukan!
[...]
) berisi sekumpulan karakter untuk dicocokkan, sedangkan awalan ^
akan menyebabkan kecocokan pelengkap dari karakter yang terdaftar. Pada contoh berikut, file yang tidak akan terdaftar: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*
karena semua nama file yang dimulai dengan salah satu karakter berikut akan dikecualikan: _cefilnopty
.