Dlaczego grep -r --include = * .js *> dirname / .filename nie zapisuje wszystkich plików .js w jednym pliku?

1

Próbuję umieścić wszystkie pliki js w katalogu i podkatalogach w jednym pliku w porządku leksykalnym. Co zrobiłem źle?

użytkownik5448026
źródło
2
Czy cat $(find ./ -type f -name "*.js" | sort) > dirname/.filenamepracowałbyś dla ciebie?
txtechhelp
@txtechhelp dzięki. jest blisko, ale pliki o nazwach 2.js i 3.js są umieszczane powyżej pliku /dirname/1.js. Jeśli to można naprawić, działałoby świetnie.
user5448026,
Mogę po prostu wstawić 1 przed nazwą reżysera, ale dobrze byłoby nie musieć tego robić.
user5448026,
Czy musisz dołączyć nazwę katalogu do swojej listy? A może potrzebujesz tylko nazw plików, skąd pochodzą?

Odpowiedzi:

0

grepjest niewłaściwym narzędziem do tego, częściowo dlatego, że emituje tylko wiersze z plików, które pasują do podanego wzorca (i prawdopodobnie chcesz wszystkie linie), a częściowo dlatego, że nie podałeś wzorca, więc używa pierwszej nazwy pliku jako wzór (co nie jest pomocne).

Wyświetlanie wszystkich *.jsplików jest dość łatwe:

find . -name '*.js'

Łączenie ich w jeden plik jest również łatwe:

find . -name '*.js' | xargs cat

Ale trudniej jest posortować je według porządku leksykalnego samej nazwy pliku, bez względu na katalog, w którym mogą się znajdować.

Po prostu sortnie wykona zadania i nie ma --keyopcji, która wybierze ostatnie pole, gdy liczba pól jest nieznana.

Poniższe polecenie sed używa do przeniesienia nazwy pliku na początek linii, sortuje ją, a następnie ponownie usuwa.

find . -name '*.js' | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2-

To nie będzie działać poprawnie, jeśli w nazwach plików lub katalogów są spacje.

Następnie możesz wyodrębnić zawartość, dodając cat:

find . -name '*.js' \
      | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2- \
      | xargs cat
ams
źródło