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 4
i -maxdepth 4
do tworzenia nowych katalogów tylko na poziomie czwartym. Bez nich -mindepth 4
otrzymalibyśmy nowe katalogi na wyższych poziomach, a bez -maxdepth 4
nowych katalogów sami zapełniłyby się nowymi katalogami, dopóki nazwy ścieżek find
nie stałyby się tak długie, że nie byłby już w stanie stworzyć więcej.
extra_folder
Katalog jest tworzony z mkdir
wywoł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 base
katalogiem (zakładam, że istnieją pliki tylko na najniższym poziomie), które znajdują się na poziomie piątym. Następnie używa polecenia -execdir
do uruchomienia mv
polecenia 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_folder
niezależ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 $1
iz nazwą pliku as $2
i utworzy folder, jeśli nie istnieje, a następnie przeniesie do niego plik.
for
,sed
i / lubfind
, i wrócić do nas nie powinno być żadnego problemu z tym?