Od tego zaczynamy:
$ tree base/
base/
|-- ab
| `-- 12
| `-- 13
| `-- 37
| |-- file1.txt
| |-- file2.txt
| `-- file3.txt
|-- af
| `-- f3
| `-- 45
| `-- 9e
| |-- third1.txt
| `-- third2.txt
`-- cd
`-- b8
`-- e2
`-- a1
|-- other1.txt
`-- other52.txt
12 directories, 7 files
Najpierw dodajemy nowe katalogi:
$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'
Używamy obu -mindepth 4i -maxdepth 4do tworzenia nowych katalogów tylko na poziomie czwartym. Bez nich -mindepth 4otrzymalibyśmy nowe katalogi na wyższych poziomach, a bez -maxdepth 4nowych katalogów sami zapełniłyby się nowymi katalogami, dopóki nazwy ścieżek findnie stałyby się tak długie, że nie byłby już w stanie stworzyć więcej.
extra_folderKatalog jest tworzony z mkdirwywoływana z -exec. Teraz mamy
$ tree base/
base/
|-- ab
| `-- 12
| `-- 13
| `-- 37
| |-- extra_folder
| |-- file1.txt
| |-- file2.txt
| `-- file3.txt
|-- af
| `-- f3
| `-- 45
| `-- 9e
| |-- extra_folder
| |-- third1.txt
| `-- third2.txt
`-- cd
`-- b8
`-- e2
`-- a1
|-- extra_folder
|-- other1.txt
`-- other52.txt
15 directories, 7 files
Następnie przeniesiemy pliki w dół:
$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'
Wyszukuje każdy zwykły plik w katalogu lub pod basekatalogiem (zakładam, że istnieją pliki tylko na najniższym poziomie), które znajdują się na poziomie piątym. Następnie używa polecenia -execdirdo uruchomienia mvpolecenia w katalogu, w którym znajduje się znaleziony plik ( {}będzie to nazwa bazowa znalezionego pliku).
Skończyliśmy z
$ tree base/
base/
|-- ab
| `-- 12
| `-- 13
| `-- 37
| `-- extra_folder
| |-- file1.txt
| |-- file2.txt
| `-- file3.txt
|-- af
| `-- f3
| `-- 45
| `-- 9e
| `-- extra_folder
| |-- third1.txt
| `-- third2.txt
`-- cd
`-- b8
`-- e2
`-- a1
`-- extra_folder
|-- other1.txt
`-- other52.txt
15 directories, 7 files
Za jednym razem:
$ find base -type f \
-execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'
Znajduje wszystkie zwykłe pliki i przenosi je do katalogu o nazwie extra_folderniezależnie od tego, od czego mają zacząć. Kilkukrotne uruchomienie tego polecenia spowoduje ich przesunięcie w dół.
Mini-skrypt wywoływany przez -execdir:
[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"
Zostanie to wywołane z nazwą folderu as $1iz nazwą pliku as $2i utworzy folder, jeśli nie istnieje, a następnie przeniesie do niego plik.
for,sedi / lubfind, i wrócić do nas nie powinno być żadnego problemu z tym?