Удаление указанных c файлов в каталоге с использованием bash - PullRequest
0 голосов
/ 28 мая 2020

У меня есть текстовый файл со списком файлов (примерно 500), например:


file_0_hard.msOut
file_1_hard.msOut
file_10_hard.msOut
.
.
.
file_1000_hard.msOut

Я хочу удалить все те файлы, чье имя отсутствует в текстовом файле. Все эти файлы находятся в одном каталоге. Как я могу сделать это, используя bash, где я читаю текстовый файл, а затем удаляю все те файлы в каталоге, которых нет в текстовом файле. Помощь будет признательна.

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Предполагается, что это каталог mydir

set -e
cd mydir
tmpdir=/tmp/x$$ # adapt this to your taste
mv $(<list.txt) $tmpdir
cd ..
rm -r mydir
mkdir mydir
mv $tmpdir/* mydir
rm -r $tmpdir

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

UPDATE :

Как прокомментировал Michiel, желательно, чтобы вы поместили свой tmpdir в та же файловая система, что и mydir.

0 голосов
/ 28 мая 2020

По строкам user1934428

Есть что сказать по этому решению. Но поскольку в нашем распоряжении есть linux с сильной файловой системой, я надеюсь. мы можем делать жесткие ссылки; Единственное требование, чтобы место назначения находилось в той же файловой системе.

Итак, в соответствии с этими строками:

  • создайте каталог для хранения файлов, которые вы хотите сохранить.
  • жесткая ссылка (ln {file} {target}); поскольку это не требует дополнительного места на диске, он сохраняет только номер inode в новом файле каталога.
  • удалить все файлы
  • переместить файлы обратно из их источника.

И на самом деле это будет примерно то же самое, что:

  • mv {files} {save spot}
  • удалить все файлы
  • mv {save spot} / {files} назад

Что делает примерно то же самое. Затем снова; это хороший способ узнать о силе жесткой ссылки.

0 голосов
/ 28 мая 2020

вы можете попробовать следующее:

cd path/dir

for f in *; do
    if ! grep -Fxq "$f" pathToFile/file.txt; then
        rm -r "$f"
    else
        printf "exists-- %s \n" ${f}
    fi
done

Если вам интересно (как и я), что -Fxq означает на простом английском языке sh:

F: влияет как интерпретируется ШАБЛОН (фиксированная строка вместо регулярного выражения)

x: Соответствует всей строке

q: Шшшш ... минимальная печать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...