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

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)


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.


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/

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