Jaki jest najszybszy i najbardziej pragmatyczny sposób połączenia wszystkich plików * .txt w katalogu w jeden duży plik tekstowy?
Obecnie używam systemu Windows z cygwin, więc mam dostęp do BASH.
Polecenie powłoki systemu Windows też byłoby fajne, ale wątpię, by było takie.
echo *.txt | xargs cat > all.txt
Pamiętaj tylko, że dla wszystkich podanych dotychczas rozwiązań powłoka decyduje o kolejności łączenia plików. W przypadku Bash, IIRC jest to kolejność alfabetyczna. Jeśli kolejność jest ważna, należy odpowiednio nazwać pliki (01file.txt, 02file.txt itp.) Lub określić każdy plik w kolejności, w której ma być konkatenowany.
źródło
Polecenie powłoki systemu Windows
type
może to zrobić:type
Polecenie type zapisuje także nazwy plików do stderr, które nie są przechwytywane przez>
operatora przekierowania (ale pojawią się na konsoli).źródło
Do
copy
łączenia plików można użyć powłoki systemu Windows .Z pomocy:
źródło
Uważaj, ponieważ żadna z tych metod nie działa z dużą liczbą plików. Osobiście użyłem tej linii:
EDIT: Jak ktoś powiedział w komentarzach, można zastąpić
$(ls | grep ".txt")
z$(ls *.txt)
EDYCJA: dzięki wiedzy @gnourf_gnourf użycie glob jest właściwym sposobem na iterację plików w katalogu. W związku z tym bluźniercze wyrażenia, takie jak,
$(ls | grep ".txt")
muszą zostać zastąpione przez*.txt
(patrz artykuł tutaj ).Dobre rozwiązanie
źródło
for i in $(ls *.txt);do cat $i >> output.txt;done
?ls | grep
jest to bardzo zły antypattern).ls *.txt
niepowodzenia, jeśli jest zbyt wiele plików (błąd zbyt długiej listy argumentów)?najbardziej pragmatycznym sposobem korzystania ze skorupy jest polecenie cat. inne sposoby obejmują
źródło
cat
metod połączy ostatnią linię i pierwszą linię z sąsiednich plików.Co powiesz na to podejście?
źródło
-maxdepth 1
dofind
polecenia.sort -u --output="$OUTPUT_FILE" --files0-from=- < <(find "$DIRECTORY_NAME" -maxdepth 1 -type f -name '*.txt' -print0)
Na przykład:
To weźmie wszystkie pliki TXT w folderze C: \ i zapisze je w folderze C: \ 1 pod nazwą all.txt
Lub
Na przykład:
To zajmie wszystkie pliki, które są obecne w folderze i umieści tam zawartość w C: \ 1 \ all.txt
źródło
Możesz to zrobić w następujący sposób:
cat [directory_path]/**/*.[h,m] > test.txt
jeśli użyjesz
{}
rozszerzenia plików, które chcesz znaleźć, istnieje problem z sekwencjonowaniem.źródło
Gdy napotkasz problem polegający na tym, że cat all.txt do all.txt, możesz spróbować sprawdzić, czy all.txt istnieje, czy nie, jeśli istnieje, usuń
Lubię to:
[ -e $"all.txt" ] && rm $"all.txt"
źródło
cat *.txt > all.txt
>
polecenie zastępuje plik all.txt, jeśli istnieje,>>
dodaje dane do istniejącego plikuwszystko to jest okropne ....
łatwe rzeczy.
źródło
find . -iname "*.txt" -maxdepth 1 -exec cat {} >> out.txt \;