2014-05-16 20 views
9

Chcę skopiować wszystkie pliki z podkatalogu do innego katalogu bez kopiowania oryginalnego folderu. W terminalu Chciałbym po prostu to zrobić:Jak skopiować wszystkie pliki z jednego katalogu do drugiego w skrypcie bash

cp -r dir1/* dir2 

a następnie dir2 będzie zawierać wszystkie pliki z dir1 bez zawierający dir1 sobie. Próbuję replikować to w skrypcie bash i otrzymuję błąd. Oto mój kod bash:

cp -r $pck_dir"/*" $TAR_DIR"/pck/" 

otrzymuję ten błąd:

cp: cannot stat ‘./mailman/lists/mailman/*’: No such file or directory 

Jest to dziwne, ponieważ mogę sprawdzić, czy katalog istnieje w pytaniu. Wierzę, że Bash narzeka na "*", ale nie jestem pewien dlaczego. Czy ktoś może mnie oświecić, jeśli chodzi o to, co robię źle?

+4

'cp -r "$ pck_dir"/ * "$ TAR_DIR"/ PCK /' - głosowanie zamknąć jak literówki. – devnull

+0

Dowolny problem z używaniem '{}' wokół zmiennych 'cp -r $ {pck_dir}/* $ {TAR_DIR}/pck /' – PradyJord

+2

Jest to jednoznacznie zadane pytanie z jasno określoną odpowiedzią. Miałem ten sam problem i dzięki temu pytaniu już go nie mam. Wyjaśnienie, dlaczego to pytanie zostało zamknięte, nie ma sensu. – andreasdr

Odpowiedz

10

Rozszerzając komentarzu devnull za:

  • Cytaty jakiegokolwiek rodzaju wokół wieloznacznego, jak *, zapobiegnie powłokę rozszerzając wieloznaczny. Tak więc powinieneś pisać tylko: "/*", jeśli chcesz ukośnika poprzedzającego literalną gwiazdę.

  • Niecytowana zmienna będzie podlegać podziałowi na słowa. Jeśli więc pck_dir ma wartość my dir, wówczas $pck_dir"/*" zostanie rozszerzone na dwa słowa my i dir/* i oba słowa zostaną przekazane do cp jako oddzielne argumenty. Jeśli nie chcesz dzielić słów, zmienne powłoki powinny zawsze być w podwójnych cudzysłowach.

Dlatego, aby dostać to, czego chcesz, użyj:

cp -r "$pck_dir"/* "$TAR_DIR/pck/" 
2

Zamiast tego należy użyć wiersza polecenia rsync.

rsync -auv dir1/dir2/

zsynchronizuje rekursywnie wszystkie pliki z folderu do dir1 dir2 folderu.

man rsync

aby uzyskać więcej wyjaśnień, aby wiedzieć, jak korzystać z tej linii Comand.

Powiązane problemy