Skopiuj określone podfoldery w systemie Linux


0

Mam podobną sturecture pliku:

/home/dave/documents/static/
/home/static/
/home/dave/pictures/static/
/home/dave/otherfolders/
...

Chcę skopiować z tego katalogu tylko foldery o nazwie static. Te foldery mogą być również podfolderami. I powinien tworzyć tę samą strukturę w nowym folderze, który miał wcześniej. To znaczy:

cp -r /home/* /otherhome/

Próbowałem tego:

find home/ -name 'static' -exec cp -r '{}/*' 'otherhome/{}' ';'

Ale dostaję błędy, które /home/dave/documents/static/*i inne statyczne foldery nie istnieją. Chyba nie mogę połączyć nazw plików /*. Masz pomysł, jak to zrobić?


Czy chcesz rekurencyjnie skopiować zawartość każdego staticfolderu otherhome?
slhck 18.11.13

Tak, więc po operacji zostanę z np. /otherhome/dave/documents/static/Innymi folderami statycznymi i niczym więcej.
davekr

Odpowiedzi:


2

Problem polega na tym, że te katalogi nie istnieją podczas próby ich skopiowania. Najpierw musisz je zrobić.

find home -type d -name 'static' -print0 | while IFS= read -rd '' dir; do 
    newdir="${dir#home/}"
    mkdir -p otherhome/"$newdir"   
    cp -R "$dir" otherhome/"${newdir%static}"
done

Musimy usunąć home/pierwotne nazwy katalogów, a następnie utworzyć nową hierarchię folderów ( mkdir -p). Następnie rekurencyjnie kopiujemy zawartość, ale musimy również usunąć staticz końca nowego katalogu, aby nie tworzyć static/static.

Może być ładniejszy sposób na osiągnięcie tego.

Przykład przed i po:

.
├── home
│   ├── dave
│   │   ├── documents
│   │   │   └── static
│   │   │       └── Untitled.txt
│   │   ├── otherfolders
│   │   └── pictures
│   │       └── static
│   │           └── Untitled2.txt
│   └── static
└── otherhome
    ├── dave
    │   ├── documents
    │   │   └── static
    │   │       └── Untitled.txt
    │   └── pictures
    │       └── static
    │           └── Untitled2.txt
    └── static
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.