Con GNU sort, y un shell donde printfestá incorporado (todos los POSIX como hoy en día excepto algunas variantes de pdksh):
printf '%s\0' * | sort -u --files0-from=- > output
Ahora, un problema con eso es que debido a que los dos componentes de esa tubería se ejecutan de manera simultánea e independiente, cuando el izquierdo expande el *globo, el derecho ya puede haber creado el outputarchivo, lo que podría causar un problema (tal vez no -uaquí) como outputsería un archivo de entrada y de salida, por lo que es posible que desee que la salida vaya a otro directorio ( > ../outputpor ejemplo), o asegúrese de que el glob no coincida con el archivo de salida.
Otra forma de abordarlo en este caso es escribirlo:
printf '%s\0' * | sort -u --files0-from=- -o output
De esa manera, se sortabre outputpara escribir y (en mis pruebas), no lo hará antes de que haya recibido la lista completa de archivos (tanto tiempo después de que el globo se haya expandido). También evitará el clobbering outputsi ninguno de los archivos de entrada es legible.
Otra forma de escribirlo con zshobash
sort -u --files0-from=<(printf '%s\0' *) -o output
Eso está usando la sustitución del proceso (donde <(...)se reemplaza por una ruta de archivo que se refiere al final de la lectura en la que printfse escribe la tubería ). Esa característica proviene ksh, pero kshinsiste en hacer la expansión de <(...)un argumento separado para el comando para que no pueda usarlo con la --option=<(...)sintaxis. Sin embargo, funcionaría con esta sintaxis:
sort -u --files0-from <(printf '%s\0' *) -o output
Tenga en cuenta que verá una diferencia con respecto a los enfoques que alimentan la salida de catlos archivos en los casos en que hay archivos que no terminan en un carácter de nueva línea:
$ printf a > a
$ printf b > b
$ printf '%s\0' a b | sort -u --files0-from=-
a
b
$ printf '%s\0' a b | xargs -r0 cat | sort -u
ab
También tenga en cuenta que sortordena usando el algoritmo de intercalación en el locale ( strcollate()), e sort -uinforma uno de cada conjunto de líneas que se clasifican de la misma manera por ese algoritmo, no líneas únicas a nivel de byte. Si solo le importa que las líneas sean únicas a nivel de byte y no le importe tanto el orden en que están ordenadas, es posible que desee fijar la configuración regional en C donde la ordenación se basa en valores de bytes ( memcmp(); eso probablemente aceleraría cosas significativamente):
printf '%s\0' * | LC_ALL=C sort -u --files0-from=- -o output
sortlo hace automáticamente para la entrada de múltiples archivos ... pero luegosort -u *también fallaríaArgument list too long, supongo