Geçerli dizinin içeriğini bir alt dizine kopyalama


Yanıtlar:


12

Klasörün içeriğini özyinelemeli olarak kopyalamak istiyorsanız (1 hata atar, aşağıdaki alternatifler):

cp -r * sub/

Biraz daha hacky, ama boş olmayan alt dizinlerde çalışır:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Başka bir oneliner:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

Veya özyinelemeli:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

Bu, alt / boş olmadığında çalışmaz -> Sub, @Oguz'un istediği bu olmadığı sürece tekrar alt kopyaya kopyalanır.

Tamam Sonunda findkoddan memnunum : D
Lekensteyn

2
İkinci komutunuz boşluk içeren dosya adları için başarısız olur. xargsVeya tuşunu kullanın -exec. grepKullanıma ! -name "$TARGETDIR"veya benzeri bir şeye gerek yoktur . Etrafınızda eşsiz tırnak işaretleri var $file. Bir özyinelemenin cp, ilk emrinizden başka herhangi bir niyetinde çalışacağını düşünmüyorum.
sonraki duyuruya kadar duraklatıldı.

Wohaa, son kodlarda bir teklifi kaçırdı. İyi yorum Dennis, bu durumda -name kullanmayı hiç düşünmedim :)
Lekensteyn

4

Diyelim targetki kabuğunuz bash ise, hedef alt dizinin adıdır:

shopt -s extglob
cp -r !(target) target/

Ksh olarak, doğrudan yapabilirsiniz cp -r !(target) target/.

Zsh, sen yapabilirsin setopt ksh_globsonra cp -r !(target) target/. Başka bir olasılık o setopt extended_globzaman cp -r ^target target/.


2

Hedef dizini kaynak dizinin dışına taşımayı ve sonra tekrar koymayı öneririm; mv ücretsizdir (farklı bir dosya sistemine geçmemeye dikkat ediyorsanız), diğer işlemlerin karışmasını / etkilenmesini beklemiyorsanız.

Dosya adlarında boşluk varsa, yukarıda yayınlanan çözümlerin çoğu çalışmaz. Find -print0 varyantlarını kullanmanızı öneririm | xargs -0 veya -exec vb. bulun.


0

Bu senin için işe yarayacak mı?

cp -r * subdir/

Geçerli dizindeki her şeyi bir alt dizine kopyalamak yerine taşımak istiyorsanız, şunları yapabilirsiniz:

mv * subdir/

bu boş olmayan dizinlerle ilgilenmez

Sadece test ettim ve işe yaradı.
karlphillip

@Lekensteyn'in önerdiği gibi boş olmayan dizinleri tekrar tekrar kopyalamanız gerekir.

-1

Bu, hedef dizinin kendisini içermeyen nokta dosyaları da dahil olmak üzere her şeyi hedef dizine kopyalar SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
Boşluk içeren dosya adları başarısız olur.
sonraki duyuruya kadar duraklatıldı.

-1

Diyelim ki dirCopy.sh dosyası



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

konsolunuzda "sh dirCopy.sh" olarak çalıştırın


2
Hayır için gereken ls: for file in *. İğneye gerek yok - kullanın $(). Komutun $()çevresinde geri (veya ) işaretlere gerek yoktur cp(bu bir hata mesajı oluşturur).
sonraki duyuruya kadar duraklatıldı.
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.