¿Cómo tar archivos sin extensiones?

0

Tengo algunos directorios con un número variable de archivos y subdirectorios. Todos los archivos que no tienen extensiones tienen que ser tareditados. Sus nombres pueden cambiar, por lo tanto no pueden ser codificados. Los subdirectorios también pueden contener un número no especificado de archivos y subdirectorios que no son relevantes y no deben incluirse en el archivo.

Me gustaría poder hacer esto con una sola línea, sin usar ningún .shscript, para que este proceso se pueda reproducir de la manera más portátil posible.


Estructura de directorio de muestra:

$ ls -1F

bar-dir/
bar.with.dots
foo-directory/
foo-no-ext
quux.dir/
quux.ext

El resultado tardebe contener solo foo-no-exten este caso.


Lo más cerca que he llegado hasta aquí es

tar -cf archive.tar --exclude=*.* --no-recursion *

Pero, cuando se ejecuta en el conjunto de muestra, el archive.tartodavía incluye los subdirectorios (aunque estén vacíos):

$ tar -tf archive.tar

bar-dir/
foo-directory/
foo-no-ext
U-D13
fuente
1
El uso de un script de shell puede ser más portátil de lo que piensas. Por ejemplo, basho perles exactamente igual en todos los sistemas, aunque tarpuede ser GNU, BSD, Solaris tar ...
grawity

Respuestas:

3

Este comando hace lo que quieres:

 find * -maxdepth 0 -type f | tar -cf archive.tar --exclude=*.* -T -

El findcomando encuentra todos los archivos *solo en el directorio actual -maxdepth 0que son archivos -type f(no directorios, dispositivos u otros archivos especiales). Los archivos resultantes se pasan a tar, que excluye los nombres que contienen un punto.

malabarista
fuente
Esto no acepta nombres de archivo con espacios. find ... | tar -T - ...Sería algo mejor.
Grawity
@grawity Editado como sugirió, ahora permite nombres de archivos con espacios.
malabarista
Sugeriría a -type fmenos que desee encontrar también enlaces, enchufes, tuberías y nodos de dispositivos.
matthias krull
@mugen Tomé tu sugerencia y edité el comando.
malabarista
1

Qué tal si:

tar -cf archive.tar `ls|grep "^[^.]*$"`

No espera mucho del shell, pero suponga que existe grep (nunca he visto un sistema sin él).

Klox
fuente