Jak mogę użyć terminalu Linux, aby skopiować wszystko z bieżącego katalogu do podkatalogu?
Jak mogę użyć terminalu Linux, aby skopiować wszystko z bieżącego katalogu do podkatalogu?
Odpowiedzi:
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
findkodu: D
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.
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.
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/
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
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
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).