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/.
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.
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).
Odpowiedzi:
Jeśli chcesz skopiować zawartość folderu rekurencyjnie (wyrzuci 1 błąd, alternatywy poniżej):
Trochę bardziej hacky, ale działa na niepustych podkatalogach:
Kolejny oneliner:
Lub rekurencyjny:
źródło
find
kodu: Dxargs
lub-exec
. Nie ma potrzebygrep
- użytkowania! -name "$TARGETDIR"
lub podobnego. Masz niezrównane cytaty$file
. Nie sądzę, że rekurencyjnycp
będzie działał tak, jak zamierzasz, z wyjątkiem pierwszego polecenia.Załóżmy, że
target
jest to podkatalog docelowy, jeśli twoja powłoka jest bash:W ksh możesz to zrobić bezpośrednio
cp -r !(target) target/
.W zsh, można to zrobić
setopt ksh_glob
późniejcp -r !(target) target/
. Inna możliwość jestsetopt extended_glob
wtedycp -r ^target target/
.źródło
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.
źródło
Czy to zadziała dla ciebie?
Jeśli planujesz przenieść się zamiast kopiować wszystko z bieżącego katalogu do podkatalogu, możesz:
źródło
Spowoduje to skopiowanie wszystkiego, w tym plików kropek, a nie samego katalogu docelowego, do katalogu docelowego
SUBDIR
:źródło
To idzie w powiedzmy plik dirCopy.sh
uruchom go jako „sh dirCopy.sh” w konsoli
źródło
ls
:for file in *
. Nie ma potrzeby korzystania z backticksa - użyj$()
. Nie ma potrzeby używania znaku wstecznego (lub$()
) wokółcp
polecenia (spowoduje to wyświetlenie komunikatu o błędzie).