2012-10-22 10 views
6

Ho un carico di filela creazione di directory dal nome del file e spostare bash

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

vorrei creare una serie di directory sulla base della prima parte del nome del file fino al primo ''

BR0200 
BR210 
W0210 

e quindi spostare i file associati nelle directory corrette (vale a dire tutti BR0200. * File in directory BR0200).

Ho avuto una pugnalata a uno script bash ma continuo a ricevere errori. Qualsiasi consiglio sarebbe stato accolto con gratitudine.

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

Ci scusiamo se questa è una domanda di base. Ho provato a cercare sul Web, ma senza risultato.

+0

@owlstead Cosa intendi? –

+0

@owlstead globbing è una delle funzioni più utili che le shell hanno da offrire. – jordanm

+0

@jordanm hai ragione, ovviamente, rimuovendo il commento. –

risposta

6

Non sono consentiti spazi bianchi attorno allo = in un incarico.

dir="${file%%.*}" 

contrario, la spaziatura è richiesto in un test.

if [ -e $dir ]; then 
    ^ ^

Per quanto riguarda i miglioramenti stilistici, non fa male a fare un inutile mkdir -p, in modo da poter sbarazzarsi di dichiarazione if.

Le virgolette non sono obbligatorie in un compito, quindi è possibile rimuoverle dalla riga dir=. Citando è comunque una buona idea ovunque, quindi non cancellare le altre citazioni.

Potrebbe essere utile aggiungere un ulteriore .* al ciclo for. In questo modo, se si esegue lo script più volte, non tenterà di spostare le sottodirectory appena create. E un trucco accurato (anche se non necessariamente un miglioramento) è quello di ridurre BR*.* W0*.* a {BR,W0}*.*.

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

Si può provare qualcosa di simile:

for file in BR * * WO; fanno dir = $ (echo $ {file} |.. awk -F '{print $ 1}' OFS =) mkdir $ dir file $ mv $ dir fatto

ho avuto una situazione simile e questo ha funzionato per me.

Problemi correlati