Jak skopiować pliki z folderu bez samego folderu

39

Próbuję skopiować pliki i podfoldery z A folderu bez A sama. Na przykład, katalog zawiera dalej:

| file1.txt   
| file2.txt    
| subfolder1   

Wykonanie następnego polecenia daje mi zły wynik:

sudo cp -r /home/username/A/ /usr/lib/B/

Wynik to

/usr/lib/B/A/...copied files...

zamiast..

/usr/lib/B/...copied files...

Jak mogę dotrzeć do oczekiwanego bez folderu źródłowego

pushandpop
źródło

Odpowiedzi:

67

zaawansowane cp

cp -r /home/username/A/. /usr/lib/B/

Jest to szczególnie świetne, ponieważ działa bez względu na to, czy katalog docelowy już istnieje.

globbing skorupy

Jeśli w katalogu nie ma zbyt wielu obiektów, możesz użyć globowania powłoki:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

/Na końcu ścieżki źródłowej jest ważna; działa bez względu na to, czy katalog docelowy już istnieje.

odnaleźć

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

lub jeśli nie potrzebujesz pustych podkatalogów:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(bez mkdir)

Hauke ​​Laging
źródło
Pierwszy działa dobrze! Wszelkie pomysły, dlaczego strona główna / nazwa użytkownika / A / * (z symbolem gwiazdy) nie mają sensu? Wariant z kropką na końcu pomógł mi, dzięki!
pushandpop,
@pushandpop A/*ma sens, ale są sytuacje, w których nie działa.
Hauke ​​Laging
3
shoptjest bashspecyficzny. Z zsh, użyj *(D). z ksh93, FIGNORE='@(.|..)'. cp -tjest specyficzny dla GNU. Ten findnie będzie działał poprawnie, ponieważ A/kilkakrotnie skopiuje zarówno jego zawartość, jak i podkatalogi.
Stéphane Chazelas,
1
Ty też chcesz -maxdepth 1( -mindepthi -maxdepthbędąc rozszerzeniami GNU, teraz obsługiwanymi także przez kilka innych. Przenośnie find .../. ! -name . -prune -exec ....)
Stéphane Chazelas
@ StéphaneChazelas Wydaje mi się, że gdzieś jest literówka. find .../.powoduje tutaj błąd.
Hauke ​​Laging
10

Jeśli w systemie GNU, z man cp:

   -T, --no-target-directory
          treat DEST as a normal file

To pozwala pisać cp -rT /home/username/A/ /usr/lib/B/dokładnie tak, jak trzeba.

michas
źródło
To powinna być zaakceptowana odpowiedź, jest to właściwe niż globbing powłoki lub użycie czegoś innego niż cp. Ale to prawda, że -Tnie będzie działać z systemem innym niż GNU cp.
noraj
3

Powiedz, cpaby skopiować zawartość katalogu, a nie sam katalog:

sudo cp -r /home/username/A/* /usr/lib/B/
terdon
źródło
Dzięki! Ale mówi: / usr / lib / B / nie jest katalogiem
pushandpop
Musisz to zrobić, shopt -s dotglobaby działały, jeśli są jakieś pliki dot /home/username/A/.
talkloud
1
@pushandpop dobrze, tak. To jest cel, który miałeś w swoim pytaniu, więc założyłem, że to katalog. Musisz utworzyć cel przed próbą skopiowania do niego plików.
terdon