Как копировать рекурсивные файлы с несколькими конкретными расширениями в Bash - PullRequest
0 голосов
/ 27 мая 2019

Я хочу скопировать все файлы с определенными расширениями рекурсивно в bash.

**** ***** редактирование 1003 *

Я написал полный сценарий. У меня есть список имен в 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

Это работает, но копирует все файлы без какой-либо дискриминации по конкретному расширению.

В чем проблема?

1 Ответ

2 голосов
/ 28 мая 2019

Простой способ решить вашу проблему - использовать find и regex:

find src/ -regex '.*\.\(tsv\|xlsx\|gz\|html\)$' -exec cp {} dest/ \;

find смотреть рекурсивно в указанном вами каталоге (в моем примере это src /), позволяет фильтровать с -regex и применять команду для сопоставления результатов с -exec

Для регулярных выражений:

.*\.

примет имя файла и точку перед расширением,

\(tsv\|xlsx\|gz\|html\)$

проверьте расширение с теми, кого вы хотите.

Блок exec - это то, что вы делаете с файлами, которые вы получили от regex

-exec cp {} dest/ \;

В этом случае вы копируете то, что получили ({} означает) в каталог назначения.

...