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.