Saya memiliki skrip sederhana yang paling saya mengerti, itu adalah perintah find yang tidak jelas. Saya punya banyak dokumentasi tetapi tidak berfungsi untuk membuatnya lebih jelas. Pikiran saya adalah bahwa hal itu bekerja seperti untuk loop, file saat ini ditemukan swap dalam untuk {} dan disalin ke $ HOME / $ DIR_NAME, tapi bagaimana pencarian dengan -path dan -o -prune kerja? Sangat menjengkelkan untuk memiliki dokumentasi yang spesifik dan relevan seperti itu dan masih belum tahu apa yang terjadi.
#!/bin/bash
# The files will be search on from the user's home
# directory and can only be backed up to a directory
# within $HOME
read -p "Which file types do you want to backup " file_suffix
read -p "Which directory do you want to backup to " dir_name
# The next lines creates the directory if it does not exist
test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name
# The find command will copy files that match the
# search criteria ie .sh . The -path, -prune and -o
# options are to exclude the backdirectory from the
# backup.
find $HOME -path $HOME/$dir_name -prune -o \
-name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
exit 0
Ini hanya dokumentasi yang saya tahu saya harus dapat mengetahui hal ini.
pola -path
Nama file cocok dengan pola pola shell. Metakarakter tidak memperlakukan / atau . khususnya; jadi, misalnya, temukan. -path "./sr*sc" akan mencetak entri untuk direktori bernama ./src/misc (jika ada). Untuk mengabaikan seluruh pohon direktori, gunakan -prune daripada memeriksa setiap file di pohon. Sebagai contoh, untuk melewati direktori src / emacs dan semua file dan direktori di bawahnya, dan mencetak nama-nama file lain yang ditemukan, lakukan sesuatu seperti ini:
find . -path ./src/emacs -prune -o -print
Dari manual Findutils
- Tindakan: Perintah -exec; Varian tidak aman dari tindakan -execdir ini ditentukan oleh POSIX. Perbedaan utama adalah bahwa perintah dieksekusi dalam direktori dari mana ditemukan dipanggil, artinya {} diperluas ke jalur relatif dimulai dengan nama salah satu direktori awal, bukan hanya nama dasar dari file yang cocok.
Sementara beberapa implementasi find menggantikan {} hanya di mana ia muncul sendiri dalam argumen, GNU find menggantikan {} di mana pun itu muncul.
Dan
Sebagai contoh, untuk membandingkan setiap file header C di atau di bawah direktori saat ini dengan file / tmp / master:
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
Jawaban:
-path
bekerja persis seperti-name
, tetapi menerapkan pola ke seluruh pathname dari file yang diperiksa, bukan ke komponen terakhir.-prune
melarang turun di bawah file yang ditemukan, kalau-kalau itu adalah direktori.Menyatukan semuanya, perintah
$HOME
.$HOME/$dir_name
maka file itu tidak akan berada di bawahnya ("memangkas" subdirektori).-o
) jika menemukan file yang cocok*$file_suffix
menyalinnya ke$HOME/$dir_name/
.Idenya tampaknya membuat cadangan dari beberapa isi
$HOME
dalam subdirektori dari$HOME
. Bagian-bagian dengan-prune
jelas diperlukan untuk menghindari membuat cadangan cadangan ...sumber
-path
berfungsi seperti-name
: memilih file. Perbedaannya adalah bahwa-name
cocok dengan pola ke nama file, sedangkan-path
cocok dengan pola ke pathname lengkap.find
selalu turun ke subdirektori, kecuali dicegah oleh-maxdepth
atau-prune
lain-path $HOME/$dir_name
adalah satu tindakan. Ini adalah tes yang memeriksa apakah jalur file yang sedang diperiksa cocok dengan apa pun$HOME/$dir_name
itu.-prune
adalah tindakan terpisah. Saya pikir kalimat pertama dari komentar pertama Anda secara akurat mencerminkan cara kerjanya.Ini adalah bagian dari perintah find, pernyataan -exec.
Ini memungkinkan Anda untuk berinteraksi dengan file / direktori yang ditemukan oleh
find
perintah.find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
berarti mencari file / direktori dalam $ HOMEUntuk memahami
-path <some_path>
, lihat `find -path` yang dijelaskanUntuk memahami
-prune
, lihat /programming/1489277/how-to-use-prune-option-of-find-in-sh-o
berarti ATAU, jadi-path <some_path>
ATAU-name *$file_suffix
-exec
berarti menjalankan perintah.cp {} $HOME/$dir_name/
salin semua file yang cocok dengan$HOME/$dir_name/
\;
berarti mengakhiri-exec
perintahsumber