Kopiowanie zawartości bieżącego katalogu do podkatalogu


13

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


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

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/.


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.


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/

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

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


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.