Tüm dosyalar alt dizinlerden geçerli dizine taşınsın mı?


14

Tüm alt dizinlerde bulunan dosyaları geçerli dizine taşıyabilir ve sonra boş alt dizinleri nasıl kaldırabilirim?

Bu soruyu buldum , ancak cevabı şu şekilde uyarladım:

mv * .

işe yaramadı; Şuna benzer bir sürü uyarı aldım:

mv: wil and ./wil are identical

Alt dizinlerde bulunan dosyaların benzersiz adları vardır.

Yanıtlar:


23

-mindepthSeçeneği de kullanabilirsiniz :

find . -type f -mindepth 2 -exec mv -i -- {} . \;

( -maxdepthSizinle birlikte dosyaların toplanacağı hiyerarşi düzeylerini de sınırlandırabilirsiniz.)

Kullandığım mv -iyapmak için ( “interaktif”) mvdosyaların üzerine yazmadan önce sorabilir. Pek çok alt dizinde uyarılmak istediğiniz isim çakışmaları olabilir.

--Opsiyon seçeneği işlemeyi durdurur, böylece mvkısa çizgi ile başlayan dosya adlarına göre karıştı almaz.

Tüm boş alt dizinleri temizleyin

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;

Ayrıca, dosyaların üzerine yazmadan üzerine yazma sorusunu atlamanın bir yolu var mı?
Filnor

2
Mv:: seçenekleri -n, --no-clobbervarolan bir dosyanın üzerine yazmaz. Siz de ilginizi çekebilir -b, --backup.
Florian Jenn

5

Bunu dene:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Daha Fazla Bilgi: Sadece bulma-stamement deneyin, size taşımak istediğiniz tüm dosyaları içeren bir liste vermelidir (dışarıda bırakın -print0). Misal:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

ile -print0ve xargsşimdi yürütülecek ifadelerin bir listesini oluşturuyorsunuz. -J %Bayrak araçları, burada liste elemanı eklemek, böylece mv $FILE .bulduğumuz her dosya için çalıştırılır.

Yukarıda BSD xargs için çalışıyor. GNU sürümünü (Linux) -I %kullanıyorsanız-J %


0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done

0
mv */* .

Tüm alt dizinlerdeki tüm dosyaları geçerli dizine taşır.

Biraz temizliğe ihtiyacınız varsa,

find . -type d -empty -delete

Tüm boş alt dizinleri silecektir.


-2

1 hızlı numara, yalnızca dosyalarınızda uzantılar varsa (nokta ile) çalışır:

mv *.* subdir/
mv .* subdir/

-2

Sadece bu komutu çalıştırın :-)

mv **/*.* .


1
Adında olmayan dosyaları bulamaz ., değil mi?
G-Man
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.