Я хочу рекурсивно скопировать все файлы с определенными расширениями в bash.
****редактирование****
Я написал полный сценарий. У меня есть список имен в файле csv, я перебираю каждое имя в этом списке, затем создаю каталог с тем же именем где-то еще, затем я ищу в своем исходном каталоге каталог с этим именем, внутри него есть несколько файлов с окончаниями xlsx,tsv,html,gz
, и я пытаюсь скопировать их все во вновь созданный каталог.
sample_list_filepath=/home/lists/papers
destination_path=/home/ds/samples
source_directories_path=/home/papers_final/new
cat $sample_list_filepath/sample_list.csv | while read line
do
echo $line
cd $source_directories_path/$line
cp -r *.{tsv,xlsx,html,gz} $source_directories_path/$line $destination_path
done
Это работает, но копирует туда все файлы без разбора по конкретному расширению.
В чем проблема?
Что вы подразумеваете под "рекурсивно". Ваша команда будет рекурсивной только в том случае, если хотя бы один исходный аргумент является каталогом
Я отредактировал, чтобы было понятнее
Простой способ решить вашу проблему — использовать find
и regex
:
find src/ -regex '.*\.\(tsv\|xlsx\|gz\|html\)$' -exec cp {} dest/ \;
find
рекурсивно искать в указанном вами каталоге (в моем примере это src/), позволяет фильтровать с помощью -regex
и применять команду для сопоставления результатов с помощью -exec
Для части регулярного выражения:
.*\.
возьмет имя файла и точку перед расширением,
\(tsv\|xlsx\|gz\|html\)$
проверьте расширение с теми, которые вы хотите.
Блок exec — это то, что вы делаете с файлами, полученными из регулярного выражения.
-exec cp {} dest/ \;
В этом случае вы копируете то, что у вас есть (значение {}
) в каталог назначения.
Это отлично работает после того, как я создал каталог назначения. Спасибо!
Для чего это?
$source_directories_path/$line