Algunos archivos tienen '?' al final del nombre del archivo, y necesito encontrar dichos archivos

Algunos archivos tienen '?' al final del nombre del archivo, y necesito encontrar dichos archivos

No tengo idea de cómo surgieron estos archivos, pero así es como se ven ls -lh:

total 8.1G
-rw-r--r--  1 root root 1.6G Apr 13  2022 test_some_data_S6_R2.fastq.gz?
-rw-r--r--  1 root root 1.5G Apr 13  2022 test_some_data_S6_R1.fastq.gz

Cuando uso ls para que el nombre del archivo se complete automáticamente, se ve así:

ls /path/to/file/test_some_data_S6_R2.fastq.gz^M

^Mse supone que es retorno de operador en DOS, por lo que mi mejor suposición es que alguien podría haber copiado el nombre de un sistema Windows y haberlo usado para nombrar el archivo. Hay muchos métodos para reemplazar ^Mel contenido del archivo, pero en mi caso quiero buscar archivos con ^Msu nombre.

Lo intenté find /path/with/files/ -iname "^M", pero no tuve suerte. Intenté escapar con \, pero todavía no había dados. Estoy haciendo SSH en unRHELmáquina que usa MobaXTerm, así que probé el acceso directo de Windows CTRL+ Q, CTRL+ M, pero oculta la ventana de trabajo actual y no inserta ^M.

Respuesta1

En bash, puedes usar $'\r'para insertar el ^Mcarácter de control.

find /path/with/files -name '*'$'\r'
  • inameno es necesario ya que la expresión global no contiene letras
  • Se debe incluir un asterisco para que coincida con el nombre antes del^M

Incluso pude ingresar ^Mdirectamente a una línea de comando bash mediante la combinación de Ctrl + v Ctrl + m. La clave real podría depender de bindsu asignación quoted-insert.

find /path/with/files -name '*^M'

Respuesta2

Aquí hay una pequeña variación del método que@choroba publicó en su respuesta.

En un editor de texto, cree un pequeño script (aquí llamado myscript) que se ve así

#!/bin/bash
find . -name "*^M" -print0 | xargs -0 ls 

El único truco aquí es que debes insertar el carácter ^Mliteralmente, y existen trucos especiales para hacerlo según el editor de texto. En vi o vim es ctrl- K. En emacs es ctrl- Q. Utilice lo que sea necesario.

Luego haga que el script sea ejecutable:

chmod 755 myscript

Luego ejecute el script ./myscript. Sólo debería enumerar los archivos que terminan con el ^Mcarácter. Si hace lo que desea, cambie xargs -0 lsy xargs -0 rm -fejecute el script nuevamente para eliminar los archivos.

información relacionada