2

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

Это была моя первоначальная идея, LIST - список файлов. PARENTDIR - это каталог верхнего уровня, в котором все файлы находятся в различных подкаталогах. Идея состояла в том, чтобы найти все архивы в любом подкаталоге и распаковать их в NEWDIR

#!/usr/bin/env bash    

LIST="listfile.txt"
PARENTDIR="/home/user/old/project"
NEWDIR="/home/user/old/project/2016"

while read line;
do
    ARCHIVE="$(find $PARENTDIR -name "$line*")"
    gunzip --stdout $ARCHIVE >$NEWDIR/$line
done <$LIST

Кажется, я не правильно понимаю команду поиска. Он работает без переменных, но без, даже без подстановки команд, вызова в командной строке. Моя комбинация кавычек и подстановочных знаков не совсем верна, но я не могу понять это правильно, расширение переменных тоже не помогает, и я думаю, что застрял ...

1 ответ1

1

Я думал об использовании опции -exec для find но это не сработало бы из-за оператора перенаправления, используемого с командой gunzip . Одним из решений будет выполнение операции в два этапа:

1. Скопируйте архивы в $NEWDIR:

    while read line
    do
        find "$PARENTDIR" -name "$line*" -exec cp -v {} "$NEWDIR" \;
    done < "$LIST"

Это должно работать с POSIX-совместимыми версиями find - не только с GNU find.

Избегайте перезаписи файлов с одинаковыми именами

Если у вас есть повторяющиеся имена файлов, они будут перезаписаны в $NEWDIR . Если вы хотите избежать перезаписи файлов, вам придется воссоздать дерево каталогов внутри $NEWDIR . Это можно сделать с помощью команды install из GNU coreutils, которая создает все части пути, аналогичные mkdir -p .

    cd "$NEWDIR"
    while read line
    do
        find . -name "$line*" -exec install -D {} $NEWDIR/{} \;
    done < "$LIST"
    cd -

2. Распакуйте скопированные файлы:

    find "$NEWDIR" -exec gunzip {} \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .