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 ls
salida para wc -l
poder 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 ls
comando usando (una o más veces) la opción -I
(--ignore=PATTERN
referencia):
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)))