Dosya adında özel karakterlere sahip dosyalar silinemiyor / taşınamıyor


17

Aşağıda görebileceğiniz gibi, dosyalar nadir karakterlere sahiptir.

dosya yöneticisi ekran görüntüsü

Bunları terminalde veya Dolphin'de silmek hatayı döndürür:

Böyle bir dosya ya da dizin yok

Dizinde koşmak ls -labana şu çıktıyı verdi:

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

fsckBaşka bir işletim sisteminden bölüm üzerinde bir komut çalıştırdım ama hiçbir şey değişmedi.

Bu dosyaları nasıl kaldırabilirim?


1
Sisteminizi şifrelenmiş bir giriş dizinine ayarladınız mı?
dobey

@dobey yapmadım.
karjedavpalaa

5
@Panther Yanılıyorsunuz. Bu değil o bile tek başına, bozuk dosya sisteminin bir göstergesi ve edilmiş bir tür veri bozulması nedeniyle, fsck bu konuda hiçbir şey olmaz.
zwol


1
Adında tanınmayan karakterlere sahip dosyalar vardı. Dosyaları yeniden adlandırmak işe yaradı. sonra silinebilirlerdi.
ravery

Yanıtlar:


35

Basit bir yol, bu dosyaları inode ile kaldırmaktır. :)

Kullan ls -limesela, her dosyanın inode sayısını göstermek için nadir karakterlerle dizinde,

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

Ardından, aşağıdaki örnekte olduğu gibi findsözdizimini kullanarak ilgili dosyayı adıyla silmek için yardımcı programı kullanın find <somepath> -inum <inode_number> -exec rm -i {} \;:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

-iSeçeneği rmSadece kaldırmak istemedim yanlışlıkla çıkarmadan dosyalarından tutmak için bunu ekledi gerçekten gerekli değildir. :) rmSilmek istediğiniz her dosya için onay istemenize neden olur .

Birden fazla dosyayı kendi düğümlerine göre kaldırmak istiyorsanız, aşağıdakiler için -o(anlam veya ) sözdizimini kullanabilirsiniz find:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

İfadeyi daha fazla -o -inum <inode_number>ifadeyle parantez içinde genişleterek daha fazla inode numarası ekleyebilirsiniz .


4
Nasıl rm -ri .?
Brent Baccala

Bu işe yaradı: <somepath> -inum <inode_number> -exec rm -i {} \; '-İnum', '{}' ve '\' komutta ne yapar?
karjedavpalaa

Tek seferde birden fazla dosyayı nasıl kaldırabilirim? Ayrıca, teşekkür ederim, benim günümü yaptın!
karjedavpalaa

2
@BrentBaccala rm -ri ., dosyaları inode ile silmiyor . Basitçe tüm çalışma dizinini geri alır ve kaldırmak istediğiniz her dosyayı sorar - ve istenmeyen dosyaları yanlışlıkla kaldırmamak için hangi dosyaları istediğini çok dikkatli olmanız gerekir. Kesinlikle bu dizini ana dizinim için kullanmak istemezdim - çok sayıda dosya içeriyor. ;)
Malte Skoruppa

3
@karjedavpalaa (1) dosyaları inode numaralarına göre aramasını -inumsöyler find. (2) {}, tarafından bulunan dosyalarla eşleşir grep. (3) \ seçeneğine ;iletilen komutu sonlandıran simgeden kaçar . (4) Tek seferde birden fazla dosyayı nasıl kaldıracağımı açıklamak için cevabımı düzenledim. -execfind
Malte Skoruppa

13

Olduğunu anlamak önemlidir değil "dosya sistemi yolsuzluk" tür fsckyardımcı olacaktır. Dosya sistemi söz konusu olduğunda, tek bir bayt 0x00 (ASCII NUL, C dize sonu işaretçisi) veya 0x2F ( dizin ayırıcı) değerine sahip olmadığı sürece dosya adları herhangi bir bayt dizisi olabilir /. (Bir dosya adı bir şekilde içine yerleştirilmiş bir 00 veya 2F bayt alırsa, fsckbunu düzeltmelidir.)

Bunun yerine, uygulama yazılımınızın (Dolphin ls) , "yerel ayarınızda" görüntülenemeyen karakterler içerdiğini düşündüğü dosya adlarıdır , bu nedenle bunları yer tutucu karakterlerle değiştirir. Sen olamaz tipi Bunu dosyaları manipüle zordur, ya bu karakterleri, ancak sürece hiç yazarak veya kopyalayıp ismini yapıştırarak olmadan bunu olarak bunu yapabilirsiniz. Örneğin, sorunlu dosyaları doğrudan Dolphin içinden silerseniz veya yeniden adlandırırsanız, Just Work gerekir (Çalışmazsa, bunun Dolphin'de bir hata olduğunu söyleyecek kadar ileri gideceğim).

Kabuktan onlar hakkında bir şeyler yapmanız gerekiyorsa (örneğin, rootbir GUI programına aitse ve bu nedenle bir GUI programı tarafından değiştirilemiyorsa), doğru sıraya genişletilecek "glob" desenlerini kullanarak bunları dolaylı olarak adlandırabilirsiniz. bayt (lar) ı geçip geçti.

Şimdi, elbette, glob deseniniz çok fazla eşleştiği için yanlışlıkla öğeleri silmek istemezsiniz, bu yüzden tavsiyem, renameher dosya adını onaltılı kodlamasına dönüştürmek için Perl yardımcı programını kullanmak olacaktır :

$ rename '$_ = unpack("H*", $_)' *

Bu herhangi bir bilgiyi yok etmez - ne dosyanın kendisi, ne de anlamı, dosya adında karıştırılmadan önce kodlanmış olabilir. Belirli dosyalar için örn.

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

Dikkat: renameFarklı kökenlerden adlandırılmış iki program vardır ; Yukarıdaki komutlar yalnızca Perl kaynaklı komutlarla çalışır. Ubuntu'da, istediğiniz "util-linux" paketinden değil, "rename" paketindekidir. rename -hayırt edecek: istediğin bu ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... istediğin bu değil ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

Aranacak anahtar şey "perlexpr" dir. Perl yeniden adlandırma işleminin yukarıdaki seçeneklerin tümünü anlamayan eski bir sürümüne sahip olabilirsiniz, ancak gösterdiğim komut yine de çalışmalıdır.

Düzenleme: 14.04 .5 altında içerdiği perl komut dosyası rename-h anahtarını desteklemiyor. Man sayfasını kontrol ederek doğru olana sahip olduğunuzu onaylayabilirsiniz man rename, bu durumda üst satır şunları içerir:

RENAME (1) Perl Programcıları Başvuru Kılavuzu RENAME (1)


rename --version Bilinmeyen seçenek: versiyon
Elder Geek

@ElderGeek Ne file $(which rename)yazdırıyor? ( fileÖnce paketin kurulu olduğundan emin ol .)
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/rename( filevarsayılan olarak yüklü) Aslında almak için sembolik bağlantıları kovalamak zorunda /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable ama man renamedaha hızlı bir gösterge ...
Elder Geek

@ElderGeek Bir perl betiği ise, büyük olasılıkla "Perl kaynaklı" eski bir versiyonudur, desteklemez --version; önerdiğim komut hala çalışmalı. (/usr/share/doc/rename/changelog.gz Debian kararsız çalıştıran bilgisayarımda --versionPerl adının 0.10 sürümünde 2013'te eklendiğini gösteriyor . Ubuntu hala bundan daha eski bir şey gönderiyor, ancak bu program aslında 2007'den beri işlevselliğini değiştirmedi (!) bu yüzden iyi.)
zwol

Ah! Bu karışıklığı açıklıyor. Aksine birçok iddiaya rağmen, Debian Ubuntu değildir. Her sürüm için konuşamam, ancak şu anda desteklenen bazı Ubuntu LTS (14.04) sürümleri hala buna sahip değil. (Her ne kadar 16.04 yapıyor)
Elder Geek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.