В конце имени некоторых файлов есть «?», и мне нужно найти такие файлы.

В конце имени некоторых файлов есть «?», и мне нужно найти такие файлы.

Я понятия не имею, как появились эти файлы, но вот как они выглядят 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

Когда я использую ls для автодополнения имени файла, это выглядит так:

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

^Mпредполагается, что это возврат носителя в DOS, поэтому я думаю, что кто-то мог скопировать имя из системы Windows и использовать его для наименования файла. Существует множество методов замены ^Mсодержимого файла, но в моем случае я хочу найти файлы с ^Mв его имени.

Я пытался find /path/with/files/ -iname "^M", но не получилось. Я пытался сбежать с \, но все еще нет кубиков. Я SSH вРХЕЛмашина с использованием MobaXTerm, поэтому я попробовал сочетание клавиш Windows CTRL+ Q, CTRL+ M, но оно скрывает текущее рабочее окно и не вставляет ^M.

решение1

В bash можно использовать $'\r'для вставки ^Mуправляющего символа.

find /path/with/files -name '*'$'\r'
  • inameне требуется, так как выражение glob не содержит букв
  • необходимо включить звездочку, чтобы соответствовать имени перед^M

Мне даже удалось войти ^Mнапрямую в командную строку bash с помощью комбинации Ctrl + v Ctrl + m. Фактическая клавиша может зависеть от bindи ее назначения quoted-insert.

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

решение2

Вот небольшая вариация метода, который@choroba написал(а) в своем ответе.

В текстовом редакторе создайте небольшой скрипт (здесь он называется myscript), который выглядит следующим образом:

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

Единственная хитрость здесь в том, что вам нужно вставить символ ^Mбуквально, и для этого есть специальные хитрости в зависимости от текстового редактора. В vi или vim это ctrl- K. В emacs это ctrl- Q. Используйте то, что нужно.

Затем сделайте скрипт исполняемым:

chmod 755 myscript

Затем выполните скрипт ./myscript. Он должен просто перечислить файлы, заканчивающиеся на ^Mсимвол. Если он делает то, что вам нужно, измените на xargs -0 lsи xargs -0 rm -fвыполните скрипт еще раз, чтобы удалить файлы

Связанный контент