У меня есть файл манифеста, который является просто списком разделенных имен файлов новой строки. Как я могу удалить все файлы, которые не называют в декларации от папки?
Я попытался создать a find ./ ! -name "filename"
управляйте динамично:
command="find ./ ! -name \"MANIFEST\" "
for line in `cat MANIFEST`; do
command=${command}"! -name \"${line}\" "
done
command=${command} -exec echo {} \;
$command
Но файлы остаются.
[Примечание:] Я знаю, что это использует эхо. Я хочу проверить то, что моя команда делает перед использованием его.
Решение: (спасибо PixelBeat)
ls -1 > ALLFILES
sort MANIFEST MANIFEST ALLFILES | uniq -u | xargs rm
Без временного файла:
ls -1 | sort MANIFEST MANIFEST - | uniq -u | xargs rm
Оба Игнорируют, отсортированы ли файлы/не.
Использование шаблона «установить разницу» из http://www.pixelbeat.org/cmdline.html#sets
(find ./ -type f -printf "%P\n"; cat MANIFEST MANIFEST; echo MANIFEST) |
sort | uniq -u | xargs -r rm
Примечание I перечислить МАНИФЕСТ дважды, если там перечислены файлы, которых на самом деле нет. Также обратите внимание, что вышеупомянутое поддерживает файлы в подкаталогах
Для каждого файла в текущем каталоге grep имя файла в файле МАНИФЕСТА и rm файл , если не совпадают.
for file in *
do grep -q -F "$file" PATH_TO_YOUR_MANIFIST || rm "$file"
done
выяснил:
ls -1 > ALLFILES
comm -3 MANIFEST ALLFILES | xargs rm
Просто для забавы, однострочный Perl ...на самом деле не требуется в этом случае, но гораздо более настраиваемый / расширяемый, чем Bash, если вы хотите что-то более интересное :)
$ ls
1 2 3 4 5 M
$ cat M
1
3
$ perl -e '{use File::Slurp; %M = map {chomp; $_ => 1} read_file("M"); $M{M}=1; \
foreach $f (glob("*")) {next if $M{$f}; unlink "$f"||die "Can not unlink: $!\n" };}'
$ ls
1 3 M
Вышеупомянутое может быть еще короче, если вы передадите манифест в STDIN
perl -e '{%M = map {chomp; $_ => 1} <>; $M{M}=1; \
foreach $f (glob("*")) {next if $M{$f};unlink "$f"||die "Can not unlink: $!\n" };}' M
Предполагается, что MANIFEST уже отсортирован:
find -type f -printf %P\\n | sort | comm -3 MANIFEST - | xargs rm