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

\b только перемещает курсор, но не перезаписывает текст.

Один из вариантов записи списка, разделенного запятыми, в awk— создать соответствующую запись и распечатать ее:

BEGIN {
    OFS = ","
    $0 = ""

    for (i = 1; i <= 3; ++i)
      $i = i

    print
}

Вывод будет 1,2,3.

И за одну -лайнерную толпу:

awk -vOFS=',' 'BEGIN { for (i = 1; i <= 3; ++i) $i = i; print }'

Установка $0в пустую строку здесь не на самом деле необходима, так как у нас есть только блок BEGINи нет входных данных, поэтому я исключил его из варианта с одной строкой -.

-2
07.04.2020, 12:18
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или .hв текущем каталоге или ниже него и выполняет cpдля каждого такого файла. Мы не можем подключиться к cp, так как эта утилита не читает свой стандартный входной поток.

Мы также стараемся избегать поиска внутри Programsкаталога (, который считается подкаталогом в текущем каталоге ). Если этого не сделать, это приведет к копированию файлов из Programsв Programs. Подробнее о -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будет копировать скрытые файлы (файлы с именами, начинающимися с точки ), в то время как первое решение не будет соответствовать этим типам имен по умолчанию.

2
28.04.2021, 23:18

Теги

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