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
find
kodu: D
xargs
lub -exec
. Nie ma potrzeby grep
- użytkowania ! -name "$TARGETDIR"
lub podobnego. Masz niezrównane cytaty $file
. Nie sądzę, że rekurencyjny cp
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:
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_glob
później cp -r !(target) target/
. Inna możliwość jest setopt extended_glob
wtedy 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ół cp
polecenia (spowoduje to wyświetlenie komunikatu o błędzie).