GNU/Linux >> Znalost Linux >  >> Linux

Bash Script k řazení souborů do abecedních složek na Readynas Duo V1?

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
...

Linux
  1. Jak ladit Bash skript?

  2. Shell Script:Třídění souborů do adresářů a podadresářů?

  3. Bash skript pro odstranění všech souborů kromě N při abecedním řazení

  1. bash:vložte soubory seznamu do proměnné a velikost pole je 1

  2. Smažte všechny soubory kromě nejnovějších 3 v bash skriptu

  3. Jak zkontrolovat, zda soubor existuje v konkrétním adresáři ve skriptu bash?

  1. Řazení v bash

  2. Spusťte příkaz bash na jenkins pipeline

  3. Bash skript pro odstranění souborů starších než x dní s podadresáři