Najlepszy sposób ręcznego sortowania losowych plików tekstowych?

1

Mam około 1000 plików tekstowych i muszę je obejrzeć, a następnie przenieść do folderu, jeśli jest to właściwy. Mogę wykonywać tylko podstawowe sortowanie według długości / rozmiaru i nie mogę grep, ponieważ tekst jest losowy. Jak mogę to zrobić oprócz ręcznego openiowania + zapisywania każdego w gedit. Jestem w systemie Ubuntu Linux. Dzięki

Zrobiłem już wszystkie sortowania, które mogę wykonać na podstawie rozmiaru, liczby słów, greps, daty itp. To jest to, co zostało. Próbuję znaleźć łatwy sposób przeglądania + zapisywania / ignorowania reszty.

Kenster
źródło

Odpowiedzi:

5

Zgaduję, że prawdopodobnie nie używasz vim... więc może to po prostu posłuży jako zachęta do nauki, a może krótki poradnik .....

$ vim *

otworzy wszystkie pliki;

:!mkdir mine/; mkdir notmine/

utworzy katalogi o nazwach „mój” i „notmine”;

:!mv % mine/

przeniesie bieżący plik do katalogu o nazwie „mój”;

:bdel

usunie ten plik z tych, z którymi ma do czynienia vim i przejdzie do następnego;

:!mv % notmine/

przeniesie bieżący plik do katalogu o nazwie „notmine”. Co się dzieje z tymi poleceniami ruchu to

  • : wchodzi w tryb wiersza poleceń
  • ! uruchamia polecenie powłoki
  • % powoduje, że vim zastępuje nazwę bieżącego pliku. Jeśli którakolwiek z nazw plików zawiera spacje , musisz podwójnie cytować % argument, np :!mv "%" mine/.

Trafienie :, następnie b, następnie strzałka w górę, aby uzyskać :bdel polecenie ponownie.

Trafienie :, następnie !mv, a następnie powtarzaj strzałkę w górę, aby przejść przez poprzednią !mv ... polecenia. Możesz także po prostu wpisać :! a następnie strzałka w górę, ale dostaniesz !mkdir... również polecenie.

W przypadku, gdy jeszcze się nie domyśliłeś, strzałka w górę w „trybie wiersza poleceń” vima (wprowadzanie przez naciśnięcie : w „trybie normalnym”) spowoduje, że przejdzie on przez poprzednie polecenia, które zaczynają się od tego, co już tam wpisałeś.


Poza tym, jeśli nie robisz tego bez wcześniejszego doświadczenia z vimem, muszę najpierw pochwalić cię za tak śmiały ruch, a następnie poinformować cię, że jeśli w dowolnym momencie przypadkowo uderzysz klawisz na klawiaturze i zaczynasz właściwie wpisywać rzeczy do pliku lub rzeczy inaczej działają nieoczekiwanie, trafienie <ESC> kilka razy, a potem u aby cofnąć wszelkie zmiany, które zrobiłeś przypadkowo . Jeśli cofniesz się zbyt daleko (tak naprawdę nie stanowi to problemu w tym przykładzie, ponieważ nie zamierzasz modyfikować żadnych plików), trafiłeś <CTRL>-R przerobić rzeczy, które właśnie cofnąłeś. The <ESC> wyprowadzi Cię z trybu Insert lub Visual, z powrotem do trybu Normalnego, czyli tam, gdzie wszystkie te polecenia faktycznie działają.


Dobra .. po tym małym PSA, wróć do naszego regularnego programowania.

Aby usprawnić przetwarzanie plików, możesz skonfigurować kilka makr:

qm:!mv % mine/<CR>:bdel<CR>q

W rzeczywistości spowoduje to przeniesienie bieżącego pliku i upuszczenie go z „listy buforów” vima, więc upewnij się, że jest to jeden z twoich podczas konfigurowania tego makra. Zauważ, że <CR> oznacza to, że w tym momencie nacisnąłeś klawisz ENTER; właściwie nie pisz <CR>.

qn:!mv % notmine/<CR>:bdel<CR>q

Ta sama umowa tutaj.

Następnie, aby przenieść plik do katalogu „kopalnia” i przejść na listę buforów, robisz

@m

Albo jeśli nie jest twoje

@n

W rzeczywistości mądrzej byłoby odwzorować te makra na litery, które są dalej na klawiaturze niż m i n.. ale to podstawowy pomysł.

intuited
źródło
+1 wyłącznie dla bardzo przyjaznego dla użytkownika przewodnika po dżungli, czyli vim. Nigdy nie używałem vima, ponieważ nie ma to dla mnie żadnego sensu, ale takie instrukcje mogą mnie kołysać. Brawo!
Torben Gundtofte-Bruun
2

Jak powiedział Mark, musisz dokładniej określić pliki. Zamiast gedit możesz użyć less pager lub head/tail aby wyświetlić części pliku, a następnie mv narzędzie do przenoszenia. To powinno nieco przyspieszyć proces.

W przypadku podejścia programistycznego, w zależności od rozmiaru pliku i gdyby zmieścił się na jednym ekranie, można zrobić coś z tą logiką:

for each file in the directory
       print it's contents to the screen
       prompt for yes/no
       if yes
             move file to other directory
       else
             leave file alone

więc zasadniczo twój program pokaże Ci zawartość każdego pliku, a jeśli chcesz go przenieść, naciśnij Y, inaczej naciśnij N. W ten sposób każdy plik może być obsługiwany w 1 lub 2 naciśnięciach klawiszy, w zależności od tego, jak go napiszesz.

John T
źródło
Ach, to świetnie, dzięki. Teraz muszę tylko wymyślić, jak to zrobić.
1
Dlaczego bash? Napisz prosty skrypt ruby ​​lub python.
Josh K
4
Dlaczego ruby ​​lub python? Napisz prosty skrypt basha.
ta.speot.is
@jane: nie, nie, patrz poniżej
msw
2

Byłem znudzony:

$ cat disposition
#!/bin/sh

# pick your preferred viewer
VIEWER=less
VIEWER=head

# the log file will actually be a script that undoes all the
# changes made, so it is more like an inverted log
log=/tmp/disposition.$$

prog=$0
dest=$1

case $# in
    0|1) echo "usage $prog dest_dir file ..."
         echo "  presents files and asks for a disposition"
         echo "  if disposition is 'yes' move it to dir"
         echo "  otherwise do nothing"
         exit 1;;
esac
# some shells may have limits on command lengths so for many files
# you might have to:
#    disposition dest_dir a*
#    disposition dest_dir b*
#    etc.

if [ ! -d $dest ] ; then
    echo "$prog: destination $dest is not a directory"
    exit 1
fi

cat > $log <<EOF
#!/bin/sh
# inverted log file created by $prog
#

EOF

shift           # toss away dest_dir from args
for file; do    # in "$@" is implied
    if (echo "===== $file =====" ; cat $file ) | $VIEWER; then
        read -p "move $file to $dest? " move
        case $move in
            [yY]*)
                echo mv \"$dest/$file\" \"$file\" >> $log
                mv "$file" "$dest/$file"
                ;;
        esac
    fi
done

echo "$prog: inverted log script can be found in $log"
msw
źródło
Tak, mógłbym to zrobić w jednej linii perla, jeśli zostanie wciśnięty. Sprawdziłem to nawet trochę. Nie jest to wystarczająco utwardzone dla kodu produkcyjnego, ale jako jednorazowe powinno być w porządku.
msw
Nigdy nie widziałem, że konieczne jest przeniesienie 0 $. Należy zauważyć, że jeśli VIEWER jest mniejszy, użytkownik nie zobaczy zachęty do przeniesienia, dopóki (q) nie użyje pliku.
Dennis Williamson
@Dennis: miałeś rację co do podwójnego shift, oops, naprawiony, dzięki.
msw
1

Przypuszczam, że już to wiesz, ale dla dobra innych możesz użyć głowy (lub ogona), aby pokazać kilka pierwszych wierszy pliku. To będzie bardziej wykonalne niż drukowanie całej rzeczy.

I oczywiście pisz skrypt bash =)

w tle programowania myślę, że to howto byłoby całkiem odpowiednie do programowania takiego skryptu http://tldp.org/LDP/abs/html/internal.html

(i jestem na tyle leniwy, żeby nie pisać)

bubu
źródło
1

Zastanawiałem się, czy naiwne klasyfikatory bayesowskie mogą zastosować kod i znaleźć Wielebny DivMod . Uderzyła mnie linia:

* is your code more like Guido's or Peter's 

Wygląda trochę starzej, ale znowu wielebny Bayes też nie robi się młodszy. Jest on dostępny jako pakiet python-revere Ubuntu, ale jestem teraz zbyt śpiący, aby podklasować rozpoznawanie w tej chwili.

msw
źródło
Wydaje się, że może to być przesada dla tego projektu, ale +1 dla łącza brzmi jak fajny moduł.
intuited
0

Czy mógłbyś dokładniej określić, dlaczego grep nie spełni twoich potrzeb? Jeśli nie ma dostrzegalnej „metody szaleństwa”, to jedynym sposobem jest ręczne. Nie można automatycznie / programowo sortować rzeczy, jeśli nie ma żadnych warunków do sortowania.

MDMarra
źródło
Ponieważ są to wszystkie pliki Pythona z kodem, który ma ponad 4 miesiące. Niektóre z nich to tylko biblioteki, niektóre to rzeczy, które pobrałem, staram się uzyskać te, które napisałem. Nie zamierzam ich automatycznie sortować, tylko niektóre narzędzia, które uratują mnie przed kliknięciem + zapisaniem + wpisaniem nowych nazw kilka tysięcy razy. Otwieranie wszystkich plików i zapisywanie lub ignorowanie za pomocą naciśnięcia klawisza, a następnie przejście do następnego. Myślę, że może zadziałać jakieś makro.
Nie jestem pewien, czy nie możesz zautomatyzować tego zadania, patrz poniżej, poniżej.
msw
1
@msw: „Powyżej” i „poniżej” w odpowiedzi (lub komentarz na temat odpowiedzi), aby odnieść się do innych odpowiedzi, naprawdę nie działa.
@roger, tak, wiem; nie można używać numerów wiadomości, a adresy w komentarzach są niewygodne. Użyłbym lepszej metafory, gdybym mógł o tym myśleć. ;)
msw
@msw - „zobacz moją odpowiedź” prawdopodobnie wystarczyłoby :)
MDMarra