Bir alt klasördeki tüm dosyaları (gizli dahil) özyinelemeli olarak * nix içindeki bir üst klasöre nasıl taşıyabilirim?


14

Bu biraz utanç verici bir soru, ama itiraf etmeliyim ki kariyerimin sonlarında hala mv komutu hakkında sorularım var.

Sık sık bu sorun var: tüm dosyaları özyinelemeli bir düzey yukarı taşımak gerekir. Diyelim ki klasör foo ve içinde bir klasör çubuğu var. Bar, nokta dosyaları ve klasörler de dahil olmak üzere çok sayıda dosya ve klasör içerir. Çubuktaki her şeyi foo seviyesine nasıl taşıyabilirim?

Foo boşsa, çubuğu bir düzey yukarı taşırım, foo'yu silerim ve çubuğu foo olarak yeniden adlandırırım. Sorunun bir parçası, "noktalar dahil her şey" için mv'nin joker karakterini anlayamıyorum. Bu sorunun bir kısmı şudur - cp ve mv komutlarının bir yerde kullandığı joker karakterlerin derinlemesine tartışılmasıdır (googling sadece çok temel öğreticiler getirir).

Yanıtlar:


19

Bash'te (ve bazılarında) bunu bir satırda gerçekleştirmek için küme ayracı genişletmeyi kullanabilirsiniz:

mv bar/{,.}* .

Virgül bir boş ve nokta ayırır, böylece mvkomut eşleşen dosya adlarını görür *ve.*


bu '..' karakterini de taşımaya çalışır, 'kaynak meşgul' mesajı ile başarısız olur. Yine de çalışır.
Xananax

3
İsimsiz kullanıcı tarafından önerilen:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b

2

Bunu yapmanın en kolay yolu iki komutla yapmaktır, çünkü * .whatever ile eşleşmez

cd /foo
mv bar/* ./
mv bar/.??* ./

Bu hatayı gerçekleştirirken öğrendiğim bar /.* öğesini kullanmak istemiyorsunuz:

rm -rf ./.* 

Bu KÖTÜ BİR ŞEY. Neden olduğunu tahmin etmek isteyen var mı? ;-)


Ben Bash veya Zsh Genişlediğinde sanmıyorum .*etmek .ve ... Zsh en azından benim için değil.
Mikael S

Mikael: Bunu yaparak sildiğim kullanıcı dizinlerini kurtarmak zorunda kaldığım için bash'ın yaptığı (veya en azından yaptığı) söz verebilirim
Matt Simmons

2

Globbing hakkında bilmeniz gereken ilk şey - komut tarafından değil, kabuk tarafından yapılır. Tüm ayrıntılar için kabuğunuzun kılavuz sayfasına bakın.


2

Bu, alt klasörlerden tüm dosyaları hasat eder ve geçerli dizine taşır

find . -type f -exec mv -iv \{} . \;

Aynı ada sahip dosyaların üzerine yazmak istiyorsanız,

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *nokta dışında tek bir karakteri izleyen her şeyi halleder. Durumunuz için yaygınsa, ekleyebilirsiniz .[a-zA-Z0-9]*. Hala gibi isimlerle dosyalar bırakacaktır .;, .^ve .^I(sekme). Her şeyi halletmeniz gerekiyorsa, biraz daha karmaşık olmanız gerekir.

mv .. `ls -f | egrep -v '^.$|^..$'

0

Bir dizin yapınız varsa /foo/bar/ve tüm dosyaları baryukarıdaki bir adımın altına taşımak istiyorsanız , bardizine gidin ve aşağıdakileri yazın:

find . -depth -print0 | cpio --null -pvd ../

Genel olarak, cpio(1)bu tür görevler için daha iyi olduğunu düşünüyorum . info cpioKabuğunuzu çıkartarak ayrıntılı belgelere göz atabilirsiniz .

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.