Saya diminta untuk menulis util satu kali yang melakukan beberapa operasi pada semua file dalam direktori yang diberikan tetapi daftar file dalam daftar yang telah ditentukan. Karena daftar yang diberikan sudah ditentukan sebelumnya, saya akan melakukan hard-code sebagai array.
Karena itu, bagaimana cara mendapatkan nama semua file yang tidak ada dalam array yang diberikan? Ini bisa dalam skrip unix standar (bash, awk, perl).
Jawaban yang Diterima:
Dengan bash
, Anda dapat melakukan:
all=(*)
except=(file1 file2 notme.txt)
only=()
IFS=/
for file in "${all[@]}"; do
case "/${except[*]}/" in
(*"/$file/"*) ;; # do nothing (exclude)
(*) only+=("$file") # add to the array
esac
done
ls -ld -- "${only[@]}"
(yang berfungsi di sini untuk file di direktori saat ini, tetapi tidak dapat diandalkan untuk gumpalan seperti all=(*/*) except=(foo/bar)
seperti yang kita gunakan /
untuk menggabungkan elemen larik untuk pencarian).
Ini didasarkan pada fakta bahwa "${array[*]}"
menggabungkan elemen array dengan karakter pertama $IFS
(di sini dipilih menjadi /
karena tidak dapat terjadi dalam file nama; NUL adalah karakter yang tidak dapat muncul di file path , tapi sayangnya bash
(berlawanan dengan zsh
) tidak dapat memiliki karakter seperti itu dalam variabelnya). Jadi untuk setiap file di $all
(di sini dengan $file
menjadi foo
sebagai contoh), kita membuat case "/file1/file2/notme.txt/" in (*"/foo/"*)
untuk memeriksa apakah $file
harus dikecualikan.