Jadi, Anda dapat menggunakan *
sebagai kartu liar untuk semua file saat menggunakan cp
dalam konteks direktori. Apakah ada cara untuk menyalin semua file kecuali x
file?
Jadi, Anda dapat menggunakan *
sebagai kartu liar untuk semua file saat menggunakan cp
dalam konteks direktori. Apakah ada cara untuk menyalin semua file kecuali x
file?
Jawaban:
Di dalam bash
Anda dapat menggunakan extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
di mana !(b*)
mengecualikan semua b*
file.
Anda nanti dapat menonaktifkan extglob
dengan
$ shopt -u extglob
find
adalah satu-satunya cara di tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync menangani ini dengan baik.
Contoh salin semua: rsync -aP /folder1/* /folder/2
Contoh salin semua dengan pengecualian: rsync -aP --exclude=x /folder1/* /folder2/
The -aP
switch:
a: Mirip dengan cp -a
, rekursif, dll. P: Menampilkan kemajuan, fitur bagus dari rsync.
-rP
alih-alih -aP
jika Anda ingin berulang. -a
adalah untuk pengarsipan. Tidak yakin apakah ini berubah atau hanya berbeda pada MacOS.
rsync
memang memiliki opsi untuk membuatnya rekursif. Contoh: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Diuji hanya pada Ubuntu)
Ini bukan fitur dari cp
, itu fitur shell Anda (itu memperluas *
berarti semua file non-dot), jadi jawabannya tergantung pada shell yang Anda gunakan. Misalnya, zsh
mendukung sintaks ini:
$ cp ^x /path/to/destination
Dimana ^x
artinya "semua file kecuali x
"
Anda juga dapat menggabungkan pola seleksi dan de-seleksi, misalnya untuk menyalin semua file wav kecuali yang mengandung xyz, Anda dapat menggunakan:
cp *.wav~*xyz*
bash
?
Dapat juga dilakukan dalam shell bourne biasa (portabel / kompatibel) dalam berbagai cara dengan alat standar dalam cara yang jauh lebih elegan daripada menggunakan globbing shell canggih atau perintah dengan opsi built-in-exclusion.
Jika tidak ada terlalu banyak file (dan tidak dengan nama termasuk spasi dan / atau linebreak), ini bisa menjadi caranya:
cp `ls | egrep -v '^excludename$'` destdir/.
Tentu, bash
dan alat-alat GNU hebat dan kuat, tetapi mereka tidak selalu tersedia. Jika Anda bermaksud memasukkannya ke dalam skrip portabel, saya akan merekomendasikan find
seperti dalam komentar oleh Rush.
Jika Anda ingin menyalin semua yang ada di folder (termasuk subfolder) ke sub-direktori tertentu:
cp -R $(ls | grep -v '^subdir$') subdir/
Bekerja dengan sh, bash, zsh (setidaknya).
cp -R * subdir/
cp
(bukan dari bash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
". Salinan tidak lengkap dengan benar. Sayangnya varian Anda rusak dengan nama file yang mengandung tanda baca spasi atau shell-sensitive. Lihat unix.stackexchange.com/q/128985/135943
extglob
adalah cara terbaik sejauh ini kurasa.
Cara lain menggunakan
cp $(ls --ignore=x) subdir/
$
dll.) Jangan pernah parsing output dari ls
. unix.stackexchange.com/q/128985/135943