Yalnızca Unix'teki dosyalar nasıl taşınır


18

mvKomutu kullanarak yalnızca düz dosyaları (dizinleri değil) Linux'ta bir klasörden başka bir klasöre nasıl taşıyabilirim ?

Denedim mv * ~/, ama dizinler dahil her şeyi kopyaladı.


yorumlarınız ek bir kısıtlamadan bahsediyor: komut gizli dosyaları geçerli çalışma dizininden taşımamalıdır. bu doğruysa, lütfen bunu belirtmek için sorunuzu düzenleyebilir misiniz? "yalnızca dosyaları taşı" demek, gizli dosyaları içeren "tüm dosyaları taşı" dır.
quack quixote

Yanıtlar:


29

Deneyebilirsin

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Vay canına, nasıl kullanılacağını bilen biri bul. Tamlık için find'da -name [^.] * Kullanmalısınız, yani --- find. -maxdepth 1 -tip f-adı [^.] * -exec mv {} yol \;
chris

BUNU KABUKUNUZA KOPYALAMAYIN. Noktalı virgül hemen yürütülmesine neden olur. :)
Sherwood Callaway

@SherwoodCallaway Noktalı virgül sonu işaretlemek için-exec
dstonek

4

Ben "her şey için bir çekiç kullanın" tür adam bu yüzden diğerleri için harici programları kullanmak şeyler için bourne kabuk programları kullanın ...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

Bazı insanlar işleri olabildiğince az yazarak yapmayı severler ama oldukça hızlı bir daktilodayım ve beynimde böyle bir şey var, bu yüzden tam olarak bakmak yerine bunu yapmak için çok fazla acı yok bulmak ve yürütmek için argümanlar ve tüm bunlar.

YMMV, yine de ...


bunun için teşekkürler ben deneyeceğim. ama hala diğer cevaba ihtiyacım var çünkü onun linux kursunda yaptığım bir proje için. çok teşekkürler

1
Bu ise Sorunuza cevap. mv dosyaları veya dizinleri veya fifos veya diğer özel dosyaları anlamıyor. mv sadece dizin girişlerini ve inode'ları anlar ve ilgili olduğu sürece dosya türünden bağımsız olarak hepsi aynıdır. MV'nin yalnızca belirli bir dosya türünü taşımasına izin vermek için, test veya bulma gibi dosyanın ne olduğunu görmek için aslında inode'a bakabilen bir şeye ihtiyacınız vardır. Başka bir deyişle, sadece mv ile yapmanız isteniyorsa, bir hile sorusu sorulur .
chris

1
Ve mv sadece bir dosya sisteminden diğerine bir dosyayı taşıyabildiği için inode'ları anladığını söylüyorum , teknik olarak bir cv sonra bir rm, bir mv değil (gerçekten sadece bir ln sonra rm). Sabit bağlantılara ve dizin girişlerine bakın.
chris

2
shorty: Bu iyi bir cevap, mv komutunun (en azından kabuk) yanında bir şey kullanmanız gerekiyor. Bu, programlama olmadan aldığı gibi bir temel ile ilgilidir.
Kyle Brandt

3

@Mereghost çok yakın. İşte tüm dosyaları (gizli dosyalar dahil) taşımak, ancak dizinleri taşımak için ne olsun:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

.Sonra bulmak Eğer geçerli dizin taşımak istediğiniz dosyaların kaynağıdır varsayar. Değilse, komut aşağıdaki gibi revize edilebilir:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

Gizli dosyaları değil, yalnızca normal dosyaları taşımak istiyorsanız:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

Normal dosyaları değil, yalnızca gizli dosyaları taşımak istiyorsanız:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

İçinde nokta bulunan bir klasörünüz yoksa hepsini basitçe taşıyabilirsiniz:

mv . ~ / destinationoutput

(Benim varsayımım tüm dosyalarınız bir şeydir. Bir şey (benim durumumda genellikle)

AMA diğer cevaplar sayesinde - çok yararlı. Teşekkür


-1

bul komutunu kullanabilirsiniz

find * -maxdepth 1 -type f -exec mv {} ~ \;

evet iyi çalıştı ama% 100 değil tüm dosyaları dizinlerden ve alt dizinlerden ~ / location kopyaladı. i başka bir dir içinde olduğum dir gizli dosyaları olmadan dosyaları kopyalamak çok temel bir şey gerekir. bu kadar. yine de tavsiye için teşekkürler

Maksimum 1 ile bu imkansız.
John T

gizli dosyaları kopyalamayacak şekilde düzeltildi.
John T

1
Bulma üzerinde sözdizimi bir dizini, sonra da işlemlerin ve eşleştirilecek şeylerin açıklamasını bulur. Genellikle, find * gibi bir joker karakteri globbing'den korumasız kullanmaz (yani find / path / to / directory -name goo * -type f.
chris

1
Bul, yalnızca incelemek için tek bir yol verirseniz düzgün çalışır. Örneğin, örneğin, - find ile başlayan herhangi bir dosya varsa beklenmedik bir şekilde patlar. Her zaman sadece bir programın dizin girişi okumasını yapması çok daha iyidir ve örneğin, iki farklı program (find ve shell) kullanıyorsunuzdur.
chris

-2

mv `bul ./sourcedir/* -tip f` ./destdir


2
Bu, adlarında boşluk içeren dosyalar için başarısız olur. Dosya adlarını yazdıran komutların çıktısı, uygun şekilde sınırlandırıldığından emin olmadıkça asla ayrıştırılmamalıdır. Ana fikir için ls (1) 'in çıktısını neden ayrıştırmamanız gerektiğine bakın . find' -execSeçeneğini kullanmak sorunu önlemek için en iyi yoldur.
slhck
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.