Mám starý ReadyNAS Duo v1 (Sparc), na kterém běží neznámá verze Linuxu.
Mám strukturu složek s více než 1 000 soubory, které chci přesunout do struktury složek založené na prvním písmenu názvu souboru (nerozlišují se malá a velká písmena).
V ideálním případě bych chtěl, aby struktura souborů vypadala takto:
myfiles-+
+-A
+ Apple.txt
+ avocado.txt
+-B
+ Banana.txt
+ broccoli.txt
etc. etc.
Měl jsem Google, ale našel jsem pouze nástroje GUI.
Lze to provést pomocí příkazového řádku nebo skriptu?
Přijatá odpověď:
Zde je malá vložka, která udělá to, co chcete:
$ mkdir -p output/{A..Z}; for i in tstdir/*; do export FILE=$(basename "$i"); LTR=$(echo" ${FILE:0:1}" | tr [a-z] [A-Z]); mv "$i" "output/$LTR/$FILE" ; done
Zde je stejný příkaz v rozbalené podobě, abyste viděli, co se děje:
$ mkdir -p output/{A..Z}
$ for i in tstdir/*; do
FILE=$(basename "$i")
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
mv "$i" "output/$LTR/$FILE"
done
Podrobnosti
Výše uvedené první předpokládá, že výstupní adresář obsahující pouze písmena neexistuje, a tak jej vytvoří,
$ mkdir -p output/{A..Z}
for
loop funguje následovně, prochází všechny soubory v tstdir/*
. Poté určí basename
této cesty a uloží ji do proměnné $FILE
. Každá iterace smyčkou je uložena v proměnné $i
.
FILE=$(basename "$i")
Poté použijeme schopnost Bashes k vrácení prvního znaku pojmenované proměnné, $FILE
a poté použijte tr
převést všechna malá písmena na velká.
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
Rozeberme to trochu podrobněji:
$ echo "${FILE:0:1}"
s
$ echo "${FILE:0:1}"
T
Pomocí tr
kódu, nyní můžete vidět, co se děje:
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
S
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
T
Zbytek příkazu pouze přesune soubory do jejich odpovídajícího adresáře s prvním písmenem.
Příklad
Řekněme, že máme tento adresář souborů:
$ touch {a-z}file {A-Z}file
$ tree tstdir/ | head -10
tstdir/
|-- afile
|-- Afile
|-- bfile
|-- Bfile
|-- cfile
|-- Cfile
|-- dfile
|-- Dfile
|-- efile
...
Po spuštění jedné vložky:
$ tree output/ | head -10
output/
|-- A
| |-- afile
| `-- Afile
|-- B
| |-- bfile
| `-- Bfile
|-- C
| |-- cfile
| `-- Cfile
...