Используйте find для определения имени файла, совпадающего с именем родительского каталога - PullRequest
0 голосов
/ 09 января 2019

Я хотел бы использовать find для поиска файлов в разных подкаталогах, которые должны соответствовать тому же шаблону, что и их родительская категория.

пример:

ls
Random1_fa  Random2_fa  Random3_fa

внутри этих папок есть разные файлы, которые я хочу найти только для каждого из них:

cd Random1_fa
Random1.fa
Random1.fastq
Random1_match_genome.fa
Random1_unmatch_genome.fa
...

Я хочу "найти" только файлы с именем "filename" .fa, например:

/foo/bar/1_Random1/Random1_fa/Random1.fa
/foo/bar/2_Random2/Random2_fa/Random2.fa
/foo/bar/3_Random5/Random5_fa/Random5.fa
/foo/bar/10_Random99/Random99_fa/Random99.fa

Я сделал:

ls | sed 's/_fa//' |find -name "*.fa"

но не то, что я искал. Я хочу перенаправить результат sed как шаблон регулярных выражений в find. Нечто похожее на «awk»:

ls| sed 's/_fa//' |find -name "$1.fa"

или

ls| sed 's/_fa/.fa/' |find -name "$1"

1 Ответ

0 голосов
/ 09 января 2019

Зачем читать со стандартного ввода, используя sed, чтобы отфильтровать файлы, чтобы исключить возможность выполнения условия регулярного выражения непосредственно с find. Сначала вы запускаете расширение оболочки glob для всех каталогов, оканчивающихся на _fa, и получаете имя строки find для использования в выражении find. Все, что вам нужно сделать, это

for dir in ./*_fa; do 
    # Ignore un-expanded globs from the for-loop. The un-expanded string woul fail
    # to match the condition for a directory(-d), so we exit the loop in case
    # we find no files to match
    [ -d "$dir" ] || continue
    # The filename from the glob expansion is returned as './name.fa'. Using the
    # built-in parameter expansion we remove the './' and '_fa' from the name
    str="${dir##./}"
    regex="${str%%_fa}"
    # We then use 'find' to identify the file as 'name.fa' in the directory
    find "$dir" -type f -name "${regex}.fa"
done

Ниже приведены имена файлов, содержащие только [A-Za-z0-9] и заканчивающиеся .fa. Запустите эту команду на верхнем уровне, содержащем ваши каталоги, чтобы соответствовать всем файлам.

Чтобы скопировать файл в другом месте, добавьте следующее

find "$dir" -type f -name "${regex}.fa" -exec cp -t /home/destinationPath {} + 
...