Contar archivos en un directorio

Contar archivos en un directorio

Utilizo el siguiente código al final de uno de mis scripts para contar la cantidad de archivos que procesé y moví a ese directorio.

# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l

Mi problema radica en cómo manejo los archivos duplicados. A partir de ahora, primero verifico la presencia del archivo (ya que mi secuencia de comandos es de naturaleza destructiva para los archivos fuente que estoy procesando). Si detecta que un archivo con ese nombre ya está procesado, modifico el nombre del archivo de la siguiente manera.

Archivo duplicado: foo.pdf

Nombre cambiado: foo.x.pdf

Si hay un foo.x.pdf, le cambio el nombre nuevamente a foo.xx.pdf. Repita según sea necesario. Tengo la intención de entrar más tarde y evaluar cada 'versión' y seleccionar la mejor para tenerla a mano. Pero aquí radica mi problema. Me gustaría contar la cantidad de archivos que no contienen .x. .xx. etcétera. ¿Cómo los elimino de la lssalida para wc -lpoder contar solo los archivos únicos?

TL;DR: ¿Cómo obtengo el recuento de archivos en un directorio determinado que no contienen una subcadena determinada en su nombre de archivo?

Respuesta1

Para encontrar la cantidad de archivos en un directorio que no contienen .x.pdf, intente:

find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c

Para encontrar la cantidad de archivos en un directorio que no contienen punto - uno o más x- punto - pdf, intente:

find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

Lo anterior busca recursivamente a través de subdirectorios. Si no quieres eso, agrega la opción -maxdepth 1. Por ejemplo:

find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

Tenga en cuenta que debido a que usamos -printf '1', este método es seguro incluso si el directorio contiene archivos cuyos nombres contienen caracteres de nueva línea.

Respuesta2

Sin subdirectorios:

echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))

porque:

for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0

Respuesta3

Puede excluir un archivo o archivos que coincidan con un patrón del lscomando usando (una o más veces) la opción -I(--ignore=PATTERNreferencia):

ls -I "*.x*.pdf" "${Destination}" | wc -l

O podrías usar el método de resta de esta manera:

echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))

información relacionada