Próbuję umieścić wszystkie pliki js w katalogu i podkatalogach w jednym pliku w porządku leksykalnym. Co zrobiłem źle?
Próbuję umieścić wszystkie pliki js w katalogu i podkatalogach w jednym pliku w porządku leksykalnym. Co zrobiłem źle?
Odpowiedzi:
grep
jest 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 *.js
plikó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 sort
nie wykona zadania i nie ma --key
opcji, 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
cat $(find ./ -type f -name "*.js" | sort) > dirname/.filename
pracowałbyś dla ciebie?