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.


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.


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 :)

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.