Jak kopiować pliki w powłoce unix za pomocą symboli wieloznacznych

6

Próbuję skopiować niektóre pliki do istniejących folderów. To jest przykład schematu

# origin 
/home/user/myfiles/folder1/group1/1.jpg
/home/user/myfiles/folder1/group1/2.jpg
/home/user/myfiles/folder1/group2/1.jpg
/home/user/myfiles/folder1/group2/2.jpg
/home/user/myfiles/folder2/group1/1.jpg
/home/user/myfiles/folder2/group1/2.jpg
/home/user/myfiles/folder2/group2/1.jpg
/home/user/myfiles/folder2/group2/2.jpg

Schemat folderu docelowego już istnieje, tylko pliki źródłowe (jpg), których tam nie ma.

Moje pytanie brzmi: jak to zrobić?

Chciałbym skończyć z czymś takim jak poniżej, ale to nie działa. Może powinienem zawrzeć wyrażenie regularne w zapytaniu, aby oddzielić gwiazdkę od wartości i użyć jako początek / cel?

 cp /home/user/myfiles/*/*/*.jpg  /home2/user/myfiles/*/*/*.jpg

Moim pierwotnym zamiarem jest użycie tego schematu kopiowania na moje pytanie bez odpowiedzi: s3cmd: jak skopiować pliki z lokalnego do S3 wiadra z istniejącą strukturą jako możliwe rozwiązanie.

Martin
źródło
Czy foldery docelowe są całkowicie puste? Jeśli tak, po prostu usuń je i skopiuj pliki i strukturę katalogów. Problemem jest również rozszerzenie powłoki drugiego zestawu gwiazdek.
Hennes
Oni nie są. Mają inne typy plików, których wciąż potrzebuję.
Martin
Czy możesz rozwinąć swoje ostatnie zdanie?
Martin
Mogę, ale wciąż próbuję owinąć głowę wokół tego, jaki jest twój dokładny cel. Komenda cp ma to samo źródło i miejsce docelowe. Pytanie s3cmd zidentyfikowało lokalnego dev i zdalną stronę s3, które mogłem zrozumieć. Ale obecne pytanie wydaje się być NOP. (To prawda, że ​​może to być spowodowane sennością).
Hennes
@Hennes Przepraszam za wprowadzenie w błąd, po prostu naprawiłem pytanie. Dest powinien być inny niż pochodzenie!
Martin

Odpowiedzi:

3

Z GNU cp możesz użyć --parents opcja, taka jak ta:

cd /home/user/myfiles ; cp --parents */*/*.jpg /home2/user/myfiles/

Musisz cd po pierwsze, jeśli tak cp --parents /home/user/myfiles/... stworzy też tych rodziców, a skończysz z /home2/user/myfiles/home/parents/myfiles/.

Jeśli potrzebujesz odpowiedzi innej niż GNUish, tradycyjną metodą unixową będzie smoła na potoku.

cd /home/user/myfiles ; tar cf - */*/*.jpg | ( cd /home2/user/myfiles ; tar xf - )

Drugi cd znajduje się w podpowłoce z drugą tar, więc tam są rozpakowywane pliki. Sam archiwum jest tworzone, wysyłane przez potok i wyodrębniane w tym samym czasie. Dodać v Zaznacz jedną z tarów, jeśli chcesz raportować postępy.

Alan Curry
źródło
1

Następujące czynności powinny załatwić sprawę:

for i in `find /home/user/myfiles/folder1 -print`; do 
  if [ ! -d $i ]; 
    then filePath=`echo $i | cut -f 4- -d"/"`; 
         cp $i /home/user/myfiles/folder2/$filePath; 
  fi; 
done

Zasadniczo rozpakowuję część nazwy pliku, która ma się zmienić między dwoma folderami, a następnie wydam polecenie kopiowania.

Zwróć uwagę na „cut -f 4- „powyżej - otrzymuje pola od czwartej. Możesz zmienić numer zgodnie z życzeniem

Może nawet basename lub istnieje prostsze polecenie ... ale na razie to zrobi :)

Sudipta Chatterjee
źródło