Удаление ведущих точек из выходных данных команды find при использовании с параметром -exec echo {}

Посмотрите на вторую строку вывода в обоих случаях. fsck --help использовал fsck.ext3 (по умолчанию в вашей системе) и отображал параметры, действительные для этого инструмента, но fsck -p /dev/mmcblk0 использовал exfatfsck, так как это подходит для вашей SD-карты.

К сожалению, exfatfsck не может исправлять ошибки, он может только сообщать о них. Так что запустите

fsck /dev/mmcblk0

, чтобы увидеть, есть ли ошибки; если есть, вам понадобится другая стратегия восстановления файловой системы:

  • используйте другую операционную систему с инструментами, способными восстанавливать файловую систему (Windows?);
  • или в Linux скопируйте все свои файлы в другое место и переформатируйте карту.

0
20.12.2016, 18:51
4 ответа

находят. -type f -exec echo {} \;

Действие по умолчанию для find - распечатать результаты. Если явно не указано иное, find по умолчанию выполняет поиск в текущем каталоге. Вашу команду можно упростить до find -type f .

Почему / когда это имеет значение? Только когда вы запустите эту команду в достаточно большом каталоге, вы начнете видеть разницу в производительности. -exec echo {} \; заставит ваш компьютер работать без надобности больше, потому что он должен запускать внешний процесс, такой как / bin / echo , чтобы распечатать имена файлов. Один экземпляр исполняемого файла echo запускается для каждого файла, найденного с помощью find .

Чтобы ответить на ваш вопрос об удалении ./ , более эффективным методом будет использование вырезать . Вы знаете, что первые два символа всегда ./ . cut -c3- сохранит только символы из позиции 3 и выше.

> cd /etc/fonts/conf.d
> find -type f | cut -c3-
99pdftoopvp.conf
00kde.conf
65-khmer.conf
README

Это не сработает, как ожидалось, если ваши имена файлов содержат символ новой строки, но это совсем другая история.

7
28.01.2020, 02:15

Предполагая, что вам нужно не только имя файла, но и полный относительный путь без ведущих ./, если у вас есть GNU find, вы можете попробовать следующее:

find . -type f -printf '%P\n'

В противном случае, вы можете попробовать одно из этих:

find . -type f -print | cut -d/ -f2-

find .[^.]* * -type f -print

Вы должны избегать последнего (подумайте о слишком длинной командной строке, если у вас много записей в каталоге).

-print делает то же самое, что и ваш -exec echo {} \;, но гораздо лучше: нет вызова внешнего процесса, поэтому меньше накладных расходов и нет нежелательных побочных эффектов с именами файлов, начинающимися с тире.

14
28.01.2020, 02:15

GNU-версия find предоставляет встроенное действие -printf format, которое позволяет вам форматировать вывод вашего запроса.

Итак, чтобы ответить на ваш вопрос

find . -type f -printf '%f\n'

Выводит только имена файлов без ведущих символов (или имена путей) с новой строкой, так что каждое имя файла находится на своей строке

2
28.01.2020, 02:15

Используйте *вместо ., и ведущий ./исчезнет.

find * -type f
28
28.01.2020, 02:15

Теги

Похожие вопросы