Как я могу использовать терминал для копирования и переименования файлов из нескольких папок? - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть папка с именем "week1", и в этой папке есть около десяти других папок, которые содержат несколько файлов, включая одну, которая называется submit.pdf.Я хотел бы иметь возможность скопировать все файлы «submit.pdf» в одну папку, в идеале, используя терминал, чтобы ускорить процесс.Я пробовал cp week1/*/submit.pdf week1/ так же, как и cp week1/*/*.pdf week1/, но он заканчивал тем, что копировал только один файл.Я только что понял, что он записывает поверх каждого файла каждый раз, поэтому я застрял с одним ... есть ли способ предотвратить это?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Вы не указываете свою ОС, но если вы используете Gnu cp, вы можете использовать cp week1/*/submit.pdf --backup=t week/, чтобы иметь (произвольно) числовые файлы, которые уже существуют; но это не даст вам никакого реального способа определить, кто есть что.

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

 for file in week1/*/submit.pdf; do cp "$file" "${file//\//-}"; done

… который создаст файлы с именем что-то вроде «week1-subdir-submit.pdf»

Что бы это ни стоило, запись "${var/s/r}" означает взять var , но перед тем, как вставить его значение, ищите s (\/, что означает /, экранирование из-за другого специального / в этом выражении) и замените его на r (-), чтобы создать уникальные имена файлов.

Редактировать : На самом деле есть еще один /, чтобы сделать его несколько раз подходящим, с синтаксисом:

             "${ var           /        /                 \/  /      -    }"
                 take "var"    replace  every instance of /   with   -
1 голос
/ 15 декабря 2011

find на помощь! Основное правило. Если вы можете перечислить нужные файлы с помощью find, вы можете скопировать их. Итак, попробуйте сначала это:

$ cd your_folder
$ find . -type f -iname 'submit.pdf'

Некоторые заметки:

  • find . означает «начать поиск из текущего каталога»
  • -type -f означает «только найти обычные файлы» (т.е. не каталоги)
  • -iname 'submit.pdf' "... без учета регистра имени 'submit.dpf'". Вам не нужно использовать 'quotation', но если вы хотите искать с использованием подстановочных знаков, вам нужно. E.g.:

     ~ foo$ find /usr/lib -iname '*.So*'
     /usr/lib/pam/pam_deny.so.2
     /usr/lib/pam/pam_env.so.2
     /usr/lib/pam/pam_group.so.2
     ...
    

Если вы хотите искать с учетом регистра, просто используйте -name вместо -iname.

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

Итак, чтобы echo все файлы, сделайте это:

$ find . -type f -iname submit.pdf -exec echo Found file {} \;

Чтобы скопировать их по одному:

$ find . -type f -iname submit.pdf -exec cp {} /destination/folder \;

Надеюсь, это поможет!

...