Kopiowanie zawartości bieżącego katalogu do podkatalogu

13

Jak mogę użyć terminalu Linux, aby skopiować wszystko z bieżącego katalogu do podkatalogu?

Oguz Bilgic
źródło
Masz na myśli kopiowanie czy przenoszenie?
Craig,

Odpowiedzi:

12

Jeśli chcesz skopiować zawartość folderu rekurencyjnie (wyrzuci 1 błąd, alternatywy poniżej):

cp -r * sub/

Trochę bardziej hacky, ale działa na niepustych podkatalogach:

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

Kolejny oneliner:

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

Lub rekurencyjny:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
Lekensteyn
źródło
nie działa to w przypadku, gdy sub / nie jest pusty -> sub skopiuje ponownie do sub, chyba że tego właśnie chciał @Oguz.
Ok, w końcu jestem zadowolony z findkodu: D
Lekensteyn,
2
Drugie polecenie kończy się niepowodzeniem dla nazw plików zawierających spacje. Użyj xargslub -exec. Nie ma potrzeby grep- użytkowania ! -name "$TARGETDIR"lub podobnego. Masz niezrównane cytaty $file. Nie sądzę, że rekurencyjny cpbędzie działał tak, jak zamierzasz, z wyjątkiem pierwszego polecenia.
Wstrzymano do odwołania.
Wohaa, przegapiłem cytat w ostatnich kodach. Dobry komentarz Dennis, nigdy nie myślałem o użyciu -name w tym przypadku :)
Lekensteyn,
4

Załóżmy, że targetjest to podkatalog docelowy, jeśli twoja powłoka jest bash:

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

W ksh możesz to zrobić bezpośrednio cp -r !(target) target/.

W zsh, można to zrobić setopt ksh_globpóźniej cp -r !(target) target/. Inna możliwość jest setopt extended_globwtedy cp -r ^target target/.

Gilles „SO- przestań być zły”
źródło
2

Sugerowałbym przeniesienie katalogu docelowego poza katalog źródłowy, a następnie odłożenie go z powrotem; mv jest darmowy (jeśli starasz się nie przenosić do innego systemu plików), chyba że oczekujesz, że inne procesy będą zakłócać / być zakłócane.

Większość opisanych powyżej rozwiązań nie będzie działać, jeśli w nazwach plików są spacje. Sugerowałbym użycie wariantów find -print0 | xargs -0 lub znajdź -exec itp.

alex
źródło
0

Czy to zadziała dla ciebie?

cp -r * subdir/

Jeśli planujesz przenieść się zamiast kopiować wszystko z bieżącego katalogu do podkatalogu, możesz:

mv * subdir/
karlphillip
źródło
nie zajmuje się to niepustymi katalogami
Właśnie przetestowałem i zadziałało.
karlphillip
musisz skopiować niepuste katalogi rekurencyjnie, jak sugerował @Lekensteyn.
-1

Spowoduje to skopiowanie wszystkiego, w tym plików kropek, a nie samego katalogu docelowego, do katalogu docelowego SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
ivern
źródło
2
Nie działa w przypadku nazw plików zawierających spacje.
Wstrzymano do odwołania.
-1

To idzie w powiedzmy plik dirCopy.sh



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

uruchom go jako „sh dirCopy.sh” w konsoli

Rahul
źródło
2
Nie potrzeba ls: for file in *. Nie ma potrzeby korzystania z backticksa - użyj $(). Nie ma potrzeby używania znaku wstecznego (lub $()) wokół cppolecenia (spowoduje to wyświetlenie komunikatu o błędzie).
Wstrzymano do odwołania.