Я студент факультета компьютерных наук. Второй год обучения - и я изучаю Linux. Из-за вируса Короны я учусь самостоятельно. Во время учебы я наткнулся на вопрос с несколькими разделами - я не могу его решить.
Вопрос хочет, чтобы я выполнил mv
команду - чтобы я перенес некоторые файлы в папку. Я попытался выполнить mv
команду - и попытался интегрировать "pipe" или другие команды, такие как find
.
По-моему, это не совсем обычная mv
команда, нужно интегрировать больше вещей, как это расшифровать, я не могу понять. Я пытался решить вопрос несколько дней. Я также пытался найти такие же вопросы на форуме - но не смог их найти.
Вопрос:
- Напишите одну команду, которая скопирует все файлы, заканчивающиеся на
.c
или.h
вPrograms
папку.
Моя попытка была, возможно, сделать это:
find "*.c" -o "*.h" | mv Programs
решение1
Задание можно интерпретировать тремя способами:
- Копировать все
.c
и.h
файлыиз текущего каталогав каталогPrograms
или - Копировать все
.c
и.h
файлыиз текущего каталога или любого места ниже негов каталогPrograms
. - Копировать все доступные
.c
и.h
из любой точки системыв каталогPrograms
.
Обратите внимание, что в назначении указано «копировать», а не «переместить». Это означает, что вам следует использовать команду cp
, а не mv
.
Первая интерпретация задания решается
cp *.[ch] Programs
(предполагая, что это *.[ch]
соответствует всем интересующим нас файлам, и в текущем каталоге их не так уж много тысяч).
Вторая интерпретация задания решается
find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
Это ищет все обычные файлы с суффиксом .c
или .h
filename в текущем каталоге или ниже и выполняется 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
будет копировать скрытые файлы (файлы с именами, начинающимися с точки), в то время как первое решение не будет соответствовать этим типам имен по умолчанию.