Как выполнить команду «mv» с условиями — переместить файлы с определенным окончанием в другую папку

Как выполнить команду «mv» с условиями — переместить файлы с определенным окончанием в другую папку

Я студент факультета компьютерных наук. Второй год обучения - и я изучаю Linux. Из-за вируса Короны я учусь самостоятельно. Во время учебы я наткнулся на вопрос с несколькими разделами - я не могу его решить.

Вопрос хочет, чтобы я выполнил mvкоманду - чтобы я перенес некоторые файлы в папку. Я попытался выполнить mvкоманду - и попытался интегрировать "pipe" или другие команды, такие как find.

По-моему, это не совсем обычная mvкоманда, нужно интегрировать больше вещей, как это расшифровать, я не могу понять. Я пытался решить вопрос несколько дней. Я также пытался найти такие же вопросы на форуме - но не смог их найти.

Вопрос:

  1. Напишите одну команду, которая скопирует все файлы, заканчивающиеся на .cили .hв Programsпапку.

Моя попытка была, возможно, сделать это:

find "*.c" -o "*.h" | mv Programs

решение1

Задание можно интерпретировать тремя способами:

  1. Копировать все .cи .hфайлыиз текущего каталогав каталог Programsили
  2. Копировать все .cи .hфайлыиз текущего каталога или любого места ниже негов каталог Programs.
  3. Копировать все доступные .cи.h из любой точки системыв каталог Programs.

Обратите внимание, что в назначении указано «копировать», а не «переместить». Это означает, что вам следует использовать команду cp, а не mv.

Первая интерпретация задания решается

cp *.[ch] Programs

(предполагая, что это *.[ch]соответствует всем интересующим нас файлам, и в текущем каталоге их не так уж много тысяч).

Вторая интерпретация задания решается

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

Это ищет все обычные файлы с суффиксом .cили .hfilename в текущем каталоге или ниже и выполняется cpдля каждого такого файла. Мы не можем выполнить конвейер, cpтак как эта утилита не читает свой стандартный входной поток.

Мы также гарантируем, чтоизбегатьпросмотр внутри Programsкаталога (предполагается, что это подкаталог в текущем каталоге). Если этого не сделать, то файлы будут скопированы из Programsв Programs. Смотрите "Объясните параметры find -path и -prune" для получения дополнительной информации о -pathи -prune.

Третью интерпретацию легко реализовать из второй:

find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

... нам просто нужно findначать с вершины дерева каталогов и указать, что Programsследует избегать каталога, указанного в пути $PWD/Programs.

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

find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
    -type f -name '*.[ch]' -readable -exec cp {} Programs \;

Для этого требуется GNU findдля -executableтеста (каталог доступен для поиска, если он является исполняемым) и -readableтест.

Обратите внимание, что findвариации здесь ограничат файлы только обычными файлами (через -type fтест), в то время как cp *.[ch]подход будет копировать любой тип вещей, которые заканчиваются этими двумя символами. Кроме того, решение findбудет копировать скрытые файлы (файлы с именами, начинающимися с точки), в то время как первое решение не будет соответствовать этим типам имен по умолчанию.

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