MediaWiki'deki tüm sayfa içeriğini nasıl düzgün bir şekilde silebilirim?


2

MediaWiki'deki tüm sayfaların nasıl silineceğini açıklayan bu sayfayı buldum , ancak yayınlamanın DELETE FROM page;iyi bir fikir olduğuna ikna olmadım . MediaWiki şeması oldukça karmaşıktır ve sadece pagetabloyu silmek muhtemelen veritabanında çözülmeyecek birçok çözülmemiş bağımlılık bırakır.

Yine de bir wikideki (aslında bir wiki'nin kopyası) tüm sayfaları tamamen silmek istiyorum. Bunu yapmanın basit bir yolu var mı?

Yanıtlar:


4

Tgr tarafından sağlanan büyük cevapta küçük bir değişiklik: bir nedenden dolayı, MediaWiki sunucumuzdaki MySQL (ve silinecek klonu) CASE...WHEN...THENyapıları reddetti, ben de eşdeğer değiştirmeleri yaptım:

:; mysql my_wiki -s -N -e \
     "SELECT CONCAT(page_namespace, ':', page_title) FROM page;" | \
     sed -e 's,^0:,:,' -e 's,^1:,Talk:,' \
         -e 's,^2:,User:,' -e 's,^3:,User talk:,' \
         -e 's,^6:,File:,' -e 's,^7:,File talk:,' \
         -e 's,^[0-9][0-9]*:.*$,,' \
     | egrep -v '^$' > /DUMP/wikipage-list-utf8.txt

Listeyi gözden geçirmeniz gerekiyorsa ve terminaliniz UTF-8 değilse (benimki gibi), iconvmetin dosyasını terminalin kodlamasına yapabilirsiniz , örneğin:

:; iconv -f utf8 -t cp1251 < /DUMP/wikipage-list-utf8.txt

Ayrıca, buna değer, söz konusu Wikimedia kurulumunda (api.php sorgusuna göre) tanımlanan ad alanları şunlardır:

<ns id="-2" case="first-letter" canonical="Media" xml:space="preserve">Медиа</ns>
<ns id="-1" case="first-letter" canonical="Special" xml:space="preserve">Служебная</ns>
<ns id="0" case="first-letter" content="" xml:space="preserve" />
<ns id="1" case="first-letter" subpages="" canonical="Talk" xml:space="preserve">Обсуждение</ns>
<ns id="2" case="first-letter" subpages="" canonical="User" xml:space="preserve">Участник</ns>
<ns id="3" case="first-letter" subpages="" canonical="User talk" xml:space="preserve">Обсуждение участника</ns>
<ns id="4" case="first-letter" subpages="" canonical="Project" xml:space="preserve">Simsla</ns>
<ns id="5" case="first-letter" subpages="" canonical="Project talk" xml:space="preserve">Обсуждение Simsla</ns>
<ns id="6" case="first-letter" canonical="File" xml:space="preserve">Файл</ns>
<ns id="7" case="first-letter" subpages="" canonical="File talk" xml:space="preserve">Обсуждение файла</ns>
<ns id="8" case="first-letter" subpages="" canonical="MediaWiki" xml:space="preserve">MediaWiki</ns>
<ns id="9" case="first-letter" subpages="" canonical="MediaWiki talk" xml:space="preserve">Обсуждение MediaWiki</ns>
<ns id="10" case="first-letter" canonical="Template" xml:space="preserve">Шаблон</ns>
<ns id="11" case="first-letter" subpages="" canonical="Template talk" xml:space="preserve">Обсуждение шаблона</ns>
<ns id="12" case="first-letter" subpages="" canonical="Help" xml:space="preserve">Справка</ns>
<ns id="13" case="first-letter" subpages="" canonical="Help talk" xml:space="preserve">Обсуждение справки</ns>
<ns id="14" case="first-letter" canonical="Category" xml:space="preserve">Категория</ns>
<ns id="15" case="first-letter" subpages="" canonical="Category talk" xml:space="preserve">Обсуждение категории</ns>

Maalesef, etiketler yerelleştirildi, ancak "kurallı" adlar peşinde olduğumuz şeyler ve yeterince açıklayıcılar.

sedYukarıda dönüştürdüğüm öğelerin yanı sıra, kullanıcı içeriği yerine "sistem verileri" gibi görünen ad alanı 8, 10 ve 12'de de girdiler vardı ve amaç mevcut kurulumun kurulumunu yalnızca içerik olmadan yeniden kullanmaktı - Onları şu şekilde olduğu gibi delete-script'e geçirmedim:

:; php deleteBatch.php /DUMP/wikipage-list-utf8.txt

Mükemmel detaylı ve bağlantılı yazı için Tgr'a teşekkürler - başlamak için ihtiyacım olan tek şey :)

MediaWiki ile sağlanan araçlar, içeriğin "uygun" bir şekilde silinmesi, veritabanına taşınması ve silinmemesi içindi. Gerçek silme için bunun veritabanı seviyesinde temizlenmesi gerekir. Bizim durumumuzda içeriğe pek aldırış etmedik (klondan çıkarılması gerektiğine dikkat ettik, yeni bir wiki sitesi oluşturmak için sadece kurulum gerekliydi), bu yüzden aşağı yukarı MySQL geçmiş günlüğüne göre yaptım. Hangi tabloların en çok boyut ve içeriğe sahip olduğunu görmek için veritabanının SQL dökümünü inceledim ve yardım veya yerelleştirme metin parçacıkları gibi sistem verilerini tutamadığı görülüyordu):

DELETE FROM text WHERE old_id IN (SELECT ar_text_id FROM archive);
DELETE FROM files WHERE old_id IN (SELECT fa_id FROM filearchive);
delete from logging;
delete from archive;
delete from filearchive;
delete from recentchanges;
delete from searchindex;
delete from uploadstash;
delete from watchlist;
delete from ipblocks;
delete from objectcache;
update user set user_password = 'cV%@4dF.' where user_id not in (1,2,3);

Ayrıca ekli dosyaları kendileri ile sildim:

:; rm -f `find mediawiki/images -type f`

Tabii ki, sadece bazı alt kümeleri değil tüm içeriği silmek istemediğiniz sürece örneklerimi körlememem, ve daha sonra geri dönüşü olmayan bir şey yapmadan önce hem veritabanını hem de dizini yedeklemekten daha iyi bir yol;


1

Gerçekten boş mu demek istiyorsunuz (örneğin, metni boş bir dize ile değiştirmek, eski metni ve önceki tüm sürümleri sayfa geçmişinde genel olarak görülebilir bırakmak için düzenlemek)?

Her şeyi silmenin en kolay yolu muhtemelen tüm sayfalarınızın api.php?action=query&meta=siteinfo&siprop=namespacesbir listesini almaktır (tüm ad alanlarının ve kanonik adlarının bir listesini almak için kullanın , ardından tüm sayfaların listesini alın ve SELECT CONCAT(CASE page_namespace WHEN 0 THEN '' WHEN 1 THEN 'Talk' ..., ':', page_title) FROM pagebu sayfa listesini içeren dosyayı iletin) deleteBatch.php.

Boşluk için, aynı listeyi edit.phpve bazı bash komut dosyalarını kullanabilirsiniz.

Ayrıca, kabuk erişiminiz yoksa, silme işlemini yapabilen pywikibot gibi çeşitli araçlar da vardır .

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.