2012-10-22 14 views
6

mam obciążenie plikówtworząc katalog z nazwą pliku i przenieść 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 

Chciałbym stworzyć serię katalogów na podstawie pierwszej części pliku do pierwszej „”

BR0200 
BR210 
W0210 

a następnie przenieś powiązane pliki do odpowiednich katalogów (tj. Wszystkich plików BR0200. * Do katalogu BR0200).

Uderzyłem w skrypt basha, ale ciągle dostaję błędy. Każda rada zostanie z wdzięcznością przyjęta.

#!/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 

Przepraszam, jeśli to podstawowe pytanie. Próbowałem przeszukiwać sieć, ale bez rezultatu.

+0

@owlstead Co masz na myśli? –

+0

@lesteste globbing jest jedną z najbardziej użytecznych funkcji, które muszle oferują. – jordanm

+0

@jordanm masz rację oczywiście, usuwając komentarz. –

Odpowiedz

6

W zadaniu nie ma dozwolonych białych znaków w obszarze =.

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

odwrotnie spacje wymagane w teście.

if [ -e $dir ]; then 
    ^ ^

miarę stylistycznych poprawek, to nie zaszkodzi zrobić niepotrzebne mkdir -p, więc można pozbyć rachunku if.

Cytaty nie są wymagane w zadaniu, więc można je usunąć z linii dir=. Cytowanie to dobry pomysł wszędzie indziej, więc nie usuwaj innych cytatów.

Może być dobrze dodać dodatkową .* do pętli for. W ten sposób, jeśli uruchamiasz skrypt więcej niż jeden raz, nie spróbujesz przenieść tych nowo utworzonych podkatalogów. A zgrabną sztuczką (choć niekoniecznie ulepszenie) jest skrócenie BR*.* W0*.* do {BR,W0}*.*.

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

Można spróbować czegoś takiego:

dla pliku w BR * WO *; nie dir = $ (echo $ {plik} |.. awk -f '{print $ 1}' OFS =) mkdir $ dir mv $ plik $ dir zrobić

miałem podobną sytuację i to działało dla mnie.

Powiązane problemy