Rasgele dosya adları (yeni satır karakterleri içerenler dahil) ile başa çıkmak için, normal hile.//.
yerine dosyaları bulmaktır .
. Çünkü //
dizin ağacında geçiş yaparken, normalde oluşamaz, emin olduğun bir //
sinyal yeni dosya başlangıcı find
(veya burada lsattr -R
) çıktı.
lsattr -R .//. | awk '
function process() {
i = index(record, " ")
if (i && index(substr(record,1,i), "i"))
print substr(record, i+4)
}
{
if (/\/\//) {
process()
record=$0
} else {
record = record "\n" $0
}
}
END{process()}'
Çıktının hala satırsonu olarak ayrılacağını unutmayın. Sonradan işlem yapmanız gerekiyorsa, uyarlamanız gerekir. Örneğin, -v ORS='\0'
GNU'lara besleyebilmek için a ekleyebilirsiniz xargs -r0
.
Ayrıca unutmayınız lsattr -R
(en azından 1.42.13) yolu daha büyüktür dosyaların bayraklarını rapor edemez PATH_MAX'dan birisi böylece, (genellikle 4096) gizlemek yolunu bileşenlerinden herhangi üst dizin hareket ettirerek böyle bir değişmez dosyası (veya o kurşun için değişmez olduğu gibi kendisi hariç) çok derin bir dizine.
Ara çözüm kullanmak olacaktır find
ile -execdir
:
find . -execdir sh -c '
a=$(lsattr -d "$1") &&
case ${a%% *} in
(*i*) ;;
(*) false
esac' sh {} \; -print0
Şimdi, -print0
bu, sonradan işlenebilir, ancak bu yollarla herhangi bir şey yapmak istiyorsanız, PATH_MAX'tan daha büyük dosya yollarındaki herhangi bir sistem çağrısının yine başarısız olacağını ve dizin bileşenlerinin aralıklarla yeniden adlandırılmış olabileceğini unutmayın.
Başkaları tarafından yazılabilir bir dizin ağacı hakkında güvenilir bir rapor lsattr
alırsak , komutun kendisinde belirtmemiz gereken birkaç sorun daha vardır :
lsattr -R .
dizin ağacında geçiş yolu , yarış koşullarına tabidir. .
Bazı dizinleri doğru anda semboliklerle değiştirerek , dizin ağacının dışındaki dizinlere inebilir .
- hatta
lsattr -d file
bir yarış durumu var. Bu öznitelikler yalnızca normal dosyalara veya dizinlere uygulanabilir. Yani lsattr
bir does lstat()
dosya sağ türleri ve daha sonra olmadığını kontrol etmek için ilk open()
takiben ioctl()
özelliklerini almak için. Ama open()
olmadan çağırıyor O_NOFOLLOW
(ne de O_NOCTTY). Birisi örneğin ve arasında file
bir sembolik işaretle yer değiştirebilir ve sistemin yeniden başlatılmasına neden olabilir. Bu yapmalıyım ardından , ve burada yarış koşulları önlemek için./dev/watchdog
lstat()
open()
open(O_PATH|O_NOFOLLOW)
fstat()
openat()
ioctl()